CMake、g++:设置 CXX 标志 -02 但 -03 仍然存在?

问题描述 投票:0回答:3

我想向发布模式添加特定的编译器 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. 如何从标志中删除-03?
  3. DNDEBUG 有何用途?

致以诚挚的问候

cmake g++ flags
3个回答
14
投票

使用编译器文档查看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 预处理器宏用于什么(在不同平台上)?了解更多信息。


4
投票

${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
投票

修改标志

如果您想覆盖设置为

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 )
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.