小编tun*_*2fs的帖子

如何使用CMake检测编译器的C++ 11支持

如果编译器支持C++ 11,有没有办法让CMake自动检测?

因为在CMake运行期间通知用户会因为编译器不支持C++ 11而无法编译代码会很好.目前我设置了C++ 11标志.但是,如果编译器不支持它,则用户在CMake运行期间会收到编译错误而不是错误.

完美将是有效的东西find_package().但是,我没有找到任何提供所需功能的模块或功能.

另外,使用该功能检测编译器是否需要标志std=c++0x或更好std=c++11.

是否有可用的东西,或者我需要自己开发这个?

下面是我目前使用的一些代码,但它只适用于GNU'c GCC编译器.如果能有更通用的解决方案,那就太好了.

if(CMAKE_COMPILER_IS_GNUCXX)
   execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION)
   if (GCC_VERSION VERSION_GREATER 4.7 OR GCC_VERSION VERSION_EQUAL 4.7)
        message(STATUS "C++11 activated.")
        add_definitions("-std=gnu++11")
   elseif(GCC_VERSION VERSION_GREATER 4.3 OR GCC_VERSION VERSION_EQUAL 4.3)
        message(WARNING "C++0x activated. If you get any errors update to a compiler which fully supports C++11")
        add_definitions("-std=gnu++0x")
   else ()
        message(FATAL_ERROR "C++11 needed. Therefore a gcc compiler with a version higher than 4.3 is needed.")   
   endif()
else(CMAKE_COMPILER_IS_GNUCXX)
   add_definitions("-std=c++0x") 
endif(CMAKE_COMPILER_IS_GNUCXX)
Run Code Online (Sandbox Code Playgroud)

c++ cmake c++11

71
推荐指数
6
解决办法
4万
查看次数

如何在typescript文件中导入没有定义文件的js库

随着项目变得越来越大,我想从JavaScript切换到TypeScript以帮助进行代码管理.然而,我们使用许多库作为amd模块,我们不想将其转换为TypeScript.

我们仍然希望将它们导入TypeScript文件,但我们也不想生成定义文件.我们怎样才能做到这一点?

例如新的Typescript文件:

/// <reference path="../../../../definetelyTyped/jquery.d.ts" />
/// <reference path="../../../../definetelyTyped/require.d.ts" />
import $ = require('jquery');
import alert = require('lib/errorInfoHandler');
Run Code Online (Sandbox Code Playgroud)

lib/errorInfoHandler是一个amd模块,包含在我们不想触及的巨大JavaScript库中.

使用上面的代码会产生以下错误:

Unable to resolve external module ''lib/errorInfoHandler'' 
Module cannot be aliased to a non-module type.
Run Code Online (Sandbox Code Playgroud)

这实际上应该产生以下代码:

define(["require", "exports", "jquery", "lib/errorInfoHandler"], function(require, exports, $, alert) {
...

}
Run Code Online (Sandbox Code Playgroud)

有没有办法将JavaScript库作为amd模块导入TypeScript,并在TypeScript文件中使用它而不制作定义文件?

javascript requirejs typescript

60
推荐指数
2
解决办法
4万
查看次数

如何在matplotlib中制作自定义图例

我目前用matplotlib以这种方式生成我的传奇:

if t==25:
    l1,l2 = ax2.plot(x320,vTemp320,'or',x320,vAnaTemp320,'-r')
elif t==50:
    l3,l4 = ax2.plot(x320,vTemp320,'ob',x320,vAnaTemp320,'-b')
else:
    l5,l6 = ax2.plot(x320,vTemp320,'og',x320,vAnaTemp320,'-g')
plt.legend((l1,l2,l3,l4,l5,l6), ('t=25 Simulation', 't=25 Analytical','t=50 Simulation', 't=50 Analytical','t=500 Simulation', 't=500 Analytical'),
   bbox_to_anchor=(-.25, 1), loc=2, borderaxespad=0.,prop={'size':12})
Run Code Online (Sandbox Code Playgroud)

以某种方式工作看1.但我的传说中有重复的信息.

我宁愿分开传说.这样我就有了与时间t对应的不同颜色的线条.作为我的分析解决方案的正常线条是模拟结果的点.

这样的事情

- (红线)t = 25

- (蓝线)t = 50

- (绿线)t = 500

o Simulaton

- 分析解决方案

现在有人能用matplotlib实现这一目标吗?

目前的形象

python matplotlib

41
推荐指数
1
解决办法
4万
查看次数

如何为std :: vector <T>专门化模板成员函数

我需要以两种不同的方式定义get方法.一个用于简单类型T.一个用于std :: vector.

template<typename T>
const T& Parameters::get(const std::string& key)
{
    Map::iterator i = params_.find(key);
    ...
    return boost::lexical_cast<T>(boost::get<std::string>(i->second));
    ...
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能为std :: vector专门化这个方法.因为代码应该看起来像这样:

template<typename T>
const T& Parameters::get(const std::string& key)
{
    Map::iterator i = params_.find(key);
    std::vector<std::string> temp = boost::get<std::vector<std::string> >(i->second)
    std::vector<T> ret(temp.size());
    for(int i=0; i<temp.size(); i++){
         ret[i]=boost::lexical_cast<T>(temp[i]);
    }
    return ret;    
}
Run Code Online (Sandbox Code Playgroud)

但我不知道如何专门为此功能.非常感谢.

c++ templates

24
推荐指数
1
解决办法
6834
查看次数

在cmake中设置最小版本的boost

我想定义一个在系统上可用的最小升压版本.我尝试了以下方法.不幸的是,这不起作用,因为它试图编译也只有系统上可用的boost 1.40.0.

SET(Boost_USE_STATIC_LIBS OFF)
SET(Boost_USE_MULTITHREAD OFF)
SET(BOOST_MIN_VERSION "1.47.0")

FIND_PACKAGE(Boost REQUIRED)

FIND_PACKAGE(Boost REQUIRED)
if (NOT Boost_FOUND)
      message(FATAL_ERROR "Fatal error: Boost (version >= 1.47.0) required.\n")
endif (NOT Boost_FOUND)

INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS})
LINK_DIRECTORIES(${Boost_LIBRARY_DIRS})
Run Code Online (Sandbox Code Playgroud)

在编译之前,我是如何让cmake控制正确的boost版本的?

c++ boost cmake

17
推荐指数
1
解决办法
8900
查看次数

如何从这些输出中获取实际的函数名称

我使用升压测试进行单元测试,使用gcov和lcov测量覆盖率.

unfortuanlly genhtml为函数覆盖生成类似的报告:

功能覆盖

我现在想知道函数_ZN7UtilLib11ProgressBarC2EjdRSo究竟是什么.

到目前为止,我无法将此函数与ProgressBar的任何类接口相关联:

class ProgressBar {
 public:
    explicit ProgressBar(
            unsigned int expected_count,
            double updateInterval = 30,
            std::ostream& os = std::cout);

    unsigned int operator+=(unsigned int increment);

    unsigned int operator++();

    unsigned int operator++(int i);
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮助我如何使用gcov获得更好的函数名称或者如何理解这些函数名称.

该应用程序使用gcc4.7编译,带有以下标志:-g -g -save-temps=obj -Wall -Wextra -Wno-unused-parameter -Wno-error=unused-parameter -O0 -pedantic

c++ gcov

8
推荐指数
1
解决办法
778
查看次数

调试boost :: thread应用程序,误报率高

我编写了一个boost :: thread应用程序,我可能会遇到一些竞争条件.我想调试这个程序.因此我使用了以下valgrind工具:

  1. halgrind
  2. DRD

不幸的是,他们的假阳性率很高.因此,下面真正简单的程序valgrind --tool=drd抱怨94错误,其中不应该.因此,通过我复杂的程序,我得到大约15000个错误.所以很难找到实际的错误.

我可以使用以下boost库1.46.0和1.47.0重现此行为.并使用valgrind 3.7.0 SVN和valgrind 3.8.0 SVN.操作系统我尝试了Ubuntu 11.10和Mac OS X 10.7.编译器所在的gcc 4.2.1和gcc 4.6.1.

#include <iostream>
#include <boost/thread.hpp>

void run()
{
    //do some stuff here
}

int main(int argc, char* argv[])
{
    boost::thread thread(run);
    thread.join();
    std::cerr << "main: done" << std::endl;
    return 0;
}
;
Run Code Online (Sandbox Code Playgroud)

你如何调试你的boost程序?还有其他工具可能更适合吗?

似乎版本3.6.1之后的valgrind被破坏了.如果我使用valgrind 3.6.1一切正常.

这里的错误报告来自valgrind --tool=drd:

==60767== Thread 1:
==60767== Conflicting store by thread 1 at 0x100026ec0 size 8
==60767==    at 0x2A316E: pthread_mutex_lock (in /usr/lib/system/libsystem_c.dylib)
==60767==    by …
Run Code Online (Sandbox Code Playgroud)

c++ debugging multithreading valgrind boost-thread

6
推荐指数
1
解决办法
750
查看次数

使用Visual Studio获取time_t的最大值

我需要让以下代码独立于工作平台:

 timeval tv;
 tv.tv_sec = std::numeric_limits<time_t>::max();
Run Code Online (Sandbox Code Playgroud)

此代码适用于各种Linux OS和Mac OS X.

不幸的是,在windows下,这将返回-1,对于tv.tv_sec.

我当时想过要重新定义time_t,就像这样:

 typedef int time_t;
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为漫画者现在抱怨:

error C2371: 'time_t' : redefinition; different basic types
Run Code Online (Sandbox Code Playgroud)

如何获得这个代码在plattform独立运行的代码?

c++ visual-studio visual-c++

5
推荐指数
1
解决办法
1658
查看次数

如何匹配0或超过1个空格的出现

我想使用正则表达式来匹配以下字符串:

blub{(没有居间空间)和blub  {(两个居间空间)和blub   {(三个居间空间)等等但不是 blub {(一个居间空间)

目前我可以在我的vimrc文件中blub{/\S{/其余部分 匹配/\S \{2,}{/.但是我无法将它们与vim中的正则表达式结合起来.我怎样才能做到这一点?

目的是在我的cpp文件中标记括号之间没有空格的所有行.

regex vim

5
推荐指数
2
解决办法
150
查看次数

cmake:根据操作系统更改EXTERNALPROJECT_ADD中的PREFIX

我需要根据操作系统更改以下代码中的cmake PREFIX.

它试过这样:

INCLUDE(ExternalProject)

EXTERNALPROJECT_ADD(
    libconfig
    URL ${CMAKE_CURRENT_SOURCE_DIR}/libconfig-1.4.8.tar.gz
    IF(APPLE)
        #Mac detected
        PREFIX libconfig/libconfig-1.4.8
    ENDIF(APPLE)
    IF(UNIX)
         PREFIX libconfig
    ENDIF(UNIX)

    CONFIGURE_COMMAND <SOURCE_DIR>/configure --prefix=<INSTALL_DIR> --disable-examples
    # We patch in order to avoid building the tests.
    # Otherwise compilation will fail due to relative paths used in libconfig.
    PATCH_COMMAND patch < ${CMAKE_CURRENT_SOURCE_DIR}/libconfig.patch
    BUILD_COMMAND make
    INSTALL_COMMAND make install
)
Run Code Online (Sandbox Code Playgroud)

linux macos cmake

4
推荐指数
1
解决办法
2480
查看次数