【发布时间】:2011-12-11 13:56:48
【问题描述】:
我只需要在 cmake 中为 DEBUG 构建设置环境变量 GLIBCXX_FORCE_NEW=1。
在 cmake 文档中,我只能找到:
CMAKE_CXX_COMPILER
CMAKE_CXX_FLAGS
CMAKE_CXX_FLAGS_DEBUG
CMAKE_CXX_FLAGS_RELEASE
CMAKE_CXX_FLAGS_RELWITHDEBINFO
【问题讨论】:
我只需要在 cmake 中为 DEBUG 构建设置环境变量 GLIBCXX_FORCE_NEW=1。
在 cmake 文档中,我只能找到:
CMAKE_CXX_COMPILER
CMAKE_CXX_FLAGS
CMAKE_CXX_FLAGS_DEBUG
CMAKE_CXX_FLAGS_RELEASE
CMAKE_CXX_FLAGS_RELWITHDEBINFO
【问题讨论】:
环境变量GLIBCXX_FORCE_NEW 仅影响已编译程序在运行时的行为(参见gcc documentation)。在程序编译期间将其添加为预处理器定义(例如,通过设置 CMAKE_CXX_FLAGS)将不会产生影响。
使用 CMake,您可以设置一个环境变量,该变量仅影响 CMake tests 的已构建目标的运行时。以下命令添加了一个对 DEBUG 构建有效的测试,它将运行带有 GLIBCXX_FORCE_NEW 变量集的可执行文件:
add_test(NAME MyTest CONFIGURATIONS Debug COMMAND MyExecutable)
set_tests_properties(MyTest PROPERTIES ENVIRONMENT "GLIBCXX_FORCE_NEW=1")
【讨论】:
你想要CMAKE_BUILD_TYPE。
您可以使用if(CMAKE_BUILD_TYPE STREQUAL "Debug") 检查构建类型。
另外,请注意 STREQUAL 区分大小写,因此您可能需要在检查之前 string(UPPERCASE ...) 您的变量。
【讨论】:
为什么需要一个“环境变量”来构建?如果您只想为调试版本设置编译器或预处理器标志,请使用 CMAKE_CXX_FLAGS_DEBUG,例如
SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DGLIBCXX_FORCE_NEW=1")
不要测试 if(CMAKE_BUILD_TYPE STREQUAL "Debug"),它不适用于所有非 Makefile CMake 生成器(OSX 与 Xcode,Windows 与 Visual Studio)
【讨论】:
To globally disable memory caching within the library for the default allocator, merely set GLIBCXX_FORCE_NEW (with any value) in the system's environment before running the program. If your program crashes with GLIBCXX_FORCE_NEW in the environment, it likely means that you linked against objects built against the older library (objects which might still using the cached allocations...).
-D后面需要一个空格,即:SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -D GLIBCXX_FORCE_NEW=1")