【问题标题】:How do I set GLIBCXX_FORCE_NEW=1 in cmake for DEBUG builds only?如何在 cmake 中为 DEBUG 构建设置 GLIBCXX_FORCE_NEW=1?
【发布时间】: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

【问题讨论】:

    标签: gcc cmake


    【解决方案1】:

    环境变量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")
    

    【讨论】:

      【解决方案2】:

      你想要CMAKE_BUILD_TYPE

      您可以使用if(CMAKE_BUILD_TYPE STREQUAL "Debug") 检查构建类型。

      另外,请注意 STREQUAL 区分大小写,因此您可能需要在检查之前 string(UPPERCASE ...) 您的变量。

      【讨论】:

        【解决方案3】:

        为什么需要一个“环境变量”来构建?如果您只想为调试版本设置编译器或预处理器标志,请使用 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)

        【讨论】:

        • 因为这是 gcc 想要的(我需要设置这个,所以 valgrind 很高兴):gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt04ch11.htmlTo 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...).
        • 那是关于运行时,而不是编译。因此,sakra 的答案是正确的。
        • 对于一般的预处理指令,-D后面需要一个空格,即:SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -D GLIBCXX_FORCE_NEW=1")
        猜你喜欢
        • 1970-01-01
        • 2013-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-19
        相关资源
        最近更新 更多