我想向发布模式添加特定的编译器 cxx 标志。我在另一个线程中读到 -O2 是发布配置的好标志
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wall -O2")
但是如果我现在检查 CXX 标志
message(${CMAKE_CXX_FLAGS_RELEASE})
他写信给我
-O3 -DNDEBUG -Wall -O2
致以诚挚的问候
使用编译器文档查看O2和O3之间的区别 并做出您的选择(:例如 - gcc。在这里您可以找到使用 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,请参阅 NDEBUG 预处理器宏用于什么(在不同平台上)?了解更多信息。
${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
如果您想覆盖设置为
CMAKE_C_FLAGS_RELEASE
的 CMAKE_CXX_FLAGS_RELEASE
CMAKE_BUILD_TYPE
的默认 release
或 -O3 -DNDEBUG
变量,您需要在 project
行之前执行此操作。本质上,如果发布构建类型默认值不适合您,您需要自己处理问题。另一种可能性是在 CMAKE_TOOLCHAIN_FILE
中处理此问题
cmake_minimum_required( VERSION 3.8 )
set( CMAKE_C_FLAGS_DEBUG "" CACHE STRING "" )
set( CMAKE_CXX_FLAGS_DEBUG "" CACHE STRING "" )
set( CMAKE_C_FLAGS_RELEASE "" CACHE STRING "" )
set( CMAKE_CXX_FLAGS_RELEASE "" CACHE STRING "" )
project(hello)
set( SOURCE_FILES
hello.c foo.c )
add_executable( hello
${SOURCE_FILES} )
set_source_files_properties( foo.c
PROPERTIES
COMPILE_FLAGS "-O3 -DNDEBUG" )
set_source_files_properties( hello.c
PROPERTIES
COMPILE_FLAGS -O0 )