如果编译器支持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) 随着项目变得越来越大,我想从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文件中使用它而不制作定义文件?
我目前用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实现这一目标吗?

我需要以两种不同的方式定义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)
但我不知道如何专门为此功能.非常感谢.
我想定义一个在系统上可用的最小升压版本.我尝试了以下方法.不幸的是,这不起作用,因为它试图编译也只有系统上可用的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版本的?
我使用升压测试进行单元测试,使用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
我编写了一个boost :: thread应用程序,我可能会遇到一些竞争条件.我想调试这个程序.因此我使用了以下valgrind工具:
不幸的是,他们的假阳性率很高.因此,下面真正简单的程序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) 我需要让以下代码独立于工作平台:
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独立运行的代码?
我想使用正则表达式来匹配以下字符串:
blub{(没有居间空间)和blub {(两个居间空间)和blub {(三个居间空间)等等但不是 blub {(一个居间空间)
目前我可以在我的vimrc文件中blub{与/\S{/其余部分 匹配/\S \{2,}{/.但是我无法将它们与vim中的正则表达式结合起来.我怎样才能做到这一点?
目的是在我的cpp文件中标记括号之间没有空格的所有行.
我需要根据操作系统更改以下代码中的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) c++ ×6
cmake ×3
boost ×1
boost-thread ×1
c++11 ×1
debugging ×1
gcov ×1
javascript ×1
linux ×1
macos ×1
matplotlib ×1
python ×1
regex ×1
requirejs ×1
templates ×1
typescript ×1
valgrind ×1
vim ×1
visual-c++ ×1