CMake,g ++:设置CXX Flags -02但-03还在吗?

时间:2013-08-14 13:45:15

标签: compiler-construction g++ cmake flags

我认为想要在发布模式中添加特定的编译器cxx标志。我在另一个线程中读到-O2是发布配置的好标志

set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wall -O2")

但如果我现在检查CXX标志

message(${CMAKE_CXX_FLAGS_RELEASE})

他写信给我

-O3 -DNDEBUG -Wall -O2
  1. 使用-02而不是-03?
  2. 是否有意义
  3. 如何从Flags中删除-03?
  4. DNDEBUG用于什么?
  5. 最好的问候

3 个答案:

答案 0 :(得分:10)

使用编译器文档查看O2和O3之间的区别  并做出选择(例如 - gccHere您可以建议将O2用于稳定性


您可以使用此宏删除标记:

macro(remove_cxx_flag flag)
  string(REPLACE "${flag}" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
endmacro()

<强> [使用方法]

  macro(remove_cxx_flag flag)
    string(REPLACE "${flag}" "" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
  endmacro()

  message(${CMAKE_CXX_FLAGS_RELEASE}) # print "-O3 -DNDEBUG"
  remove_cxx_flag("-O3")
  message(${CMAKE_CXX_FLAGS_RELEASE}) # print "-DNDEBUG"

这里使用的是宏,因为你需要从父范围更新变量,读取这个 - http://www.cmake.org/cmake/help/v2.8.10/cmake.html#command:macro(或者你可以使用PARENT_SCOPE修饰符的函数)


NDEBUG用于停用assert,有关详细信息,请参阅What is the NDEBUG preprocessor macro used for (on different platforms)?

答案 1 :(得分:1)

${val}引用变量。

您的set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wall -O2")

添加先前配置的CMAKE_CXX_FLAGS_RELEASE变量。

所以将其改为

set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG -Wall -O2")

-DNDEBUG从您的代码中删除断言 - 跳过它。 更多http://en.cppreference.com/w/cpp/error/assert

答案 2 :(得分:0)

修改标志

如果您要覆盖设置为CMAKE_C_FLAGS_RELEASE的{​​{1}} CMAKE_CXX_FLAGS_RELEASE的默认CMAKE_BUILD_TYPErelease变量,则需要执行此操作在-O3 -DNDEBUG行之前。从本质上讲,如果发布版本类型默认不适合您,您需要自己动手。另一种可能性是在project

中处理此问题
CMAKE_TOOLCHAIN_FILE