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

Ark*_*aid 7 compiler-construction flags g++ cmake

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

set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wall -O2")
Run Code Online (Sandbox Code Playgroud)

但如果我现在检查CXX标志

message(${CMAKE_CXX_FLAGS_RELEASE})
Run Code Online (Sandbox Code Playgroud)

他写信给我

-O3 -DNDEBUG -Wall -O2
Run Code Online (Sandbox Code Playgroud)
  1. 使用-02而不是-03是否有意义?
  2. 如何从Flags中删除-03?
  3. 什么是DNDEBUG用于?

最好的祝福

小智 10

使用编译器文档来查看O2和O3之间的区别并做出选择(例如 - gcc.在这里你可以找到使用O2来保证稳定性的建议.


您可以使用此宏来删除标志:

macro(remove_cxx_flag flag)
  string(REPLACE "${flag}" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
endmacro()
Run Code Online (Sandbox Code Playgroud)

[用法]

  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"
Run Code Online (Sandbox Code Playgroud)

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


NDEBUG用于禁用断言,请参阅用于(在不同平台上)的NDEBUG预处理器宏是什么?了解更多信息.