在其他地方已经提出了问题,"如何关闭一个文件的优化?"答案通常是这样的:
cmake_minimum_required( VERSION 3.8 )
project( Hello )
add_executable( hello hello.c foo.c bar.c )
set( CMAKE_C_FLAGS_RELEASE "" )
set( CMAKE_CXX_FLAGS_RELEASE "" )
set_source_files_properties( hello.c
PROPERTIES
COMPILE_FLAGS -O0 )
除非你像这样调用cmake:
cmake -GNinja -DCMAKE_BUILD_TYPE=Release ../hello
你可以在build.ninja
FLAGS = -O3 -DNDEBUG -O0
上的文档
编译此源文件时要添加的其他标志。
这是有道理的,它被添加到COMPILE_FLAGS列表中,它不会覆盖现有的编译器标志。
那么,在CMake中如何覆盖单个文件的优化级别,并能够在Release
中编译项目的其余部分?否则你可以强制编译为CMAKE_BUILD_TYPE=""
,这是默认行为,但这有点挫败了Cmake的卖点。
答案 0 :(得分:2)
您无法在源文件级别使用makefile
CMake生成器覆盖编译器选项。随后会附加选项(有关完整公式,请参阅my answer Is Cmake set variable recursive?)。
据我所知 - 仅支持Visual Studio
解决方案/项目生成器。这些生成器具有flag tables来标识同一组中的标志/覆盖先前定义的标志。
所以你的更像是一个功能请求,它还要向CMake的makefile
生成器添加编译器选项表。
<强>替代强>
我只是想添加一些疯狂的CMake魔法,我想出了一个解决方法。在CMakeLists.txt
命令后将以下内容添加到主project()
:
if (CMAKE_BUILD_TYPE)
define_property(
SOURCE
PROPERTY COMPILE_FLAGS
INHERITED
BRIEF_DOCS "brief-doc"
FULL_DOCS "full-doc"
)
string(TOUPPER ${CMAKE_BUILD_TYPE} _build_type)
set_directory_properties(PROPERTIES COMPILE_FLAGS "${CMAKE_CXX_FLAGS_${_build_type}}")
set(CMAKE_CXX_FLAGS_${_build_type} "")
endif()
此示例将CMAKE_CXX_FLAGS_<build type>
内容移动到新的COMPILE_FLAGS
目录属性中,然后通过define_property(... INHERITED ...)
链接到COMPILE_FLAGS
源文件属性。
现在,构建类型特定标志仅在COMPILE_FLAGS
中为每个源文件定义,您可以覆盖/更改它们,例如使用示例中的代码段:
set_source_files_properties(
hello.c
PROPERTIES
COMPILE_FLAGS -O0
)
<强>参考强>