CMake每文件优化

CMake每文件优化,cmake,Cmake,在其他地方,有人提出了这样一个问题:“如何关闭一个文件的优化?”答案通常是这样的: 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

在其他地方,有人提出了这样一个问题:“如何关闭一个文件的优化?”答案通常是这样的:

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 -GNinja -DCMAKE_BUILD_TYPE=Release ../hello
除非您像下面这样调用cmake,否则此操作有效:

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 -GNinja -DCMAKE_BUILD_TYPE=Release ../hello
在你的
build.ninja

FLAGS = -O3 -DNDEBUG   -O0
检查上的文档

编译此源文件时要添加的其他标志

这是有意义的,它被添加到COMPILE_标志的列表中,它不会覆盖现有的编译器标志


因此,在CMake中,如何在单个文件上覆盖优化级别,并能够在
版本中编译项目的其余部分?否则,您可以强制编译到
CMAKE\u BUILD\u TYPE=”“
,这是默认行为,但这有点违背了CMAKE的卖点。

您不能在源文件级别用
makefile
CMAKE生成器覆盖编译器选项。始终附加选项(有关完整公式,请参见处)

据我所知,只有
visualstudio
解决方案/项目生成器才支持这一点。这些生成器必须识别同一组/中覆盖以前定义的标志的标志

因此,您的请求更像是一个功能请求,将编译器选项表添加到CMake的
makefile
生成器中


备选方案

我只是想添加一些疯狂的CMake魔法,作为解决方法。在
project()
命令之后,将以下内容添加到主
CMakeLists.txt

if(CMAKE\u BUILD\u类型)
定义属性(
来源
属性编译\u标志
继承
简要文档“简要文档”
完整文档“完整文档”
)
字符串(TOUPPER${CMAKE_BUILD_TYPE}}u BUILD_TYPE)
设置目录属性(属性编译标记“${CMAKE\U CXX\U标记${{U构建类型}”)
设置(CMAKE_CXX_标志${{u构建类型}“”)
endif()
此示例将
CMAKE\u CXX\u FLAGS\u
内容移动到一个新的
COMPILE\u FLAGS
目录属性中,然后通过链接到
COMPILE\u FLAGS
源文件属性

现在,构建类型特定的标志仅在每个源文件的
COMPILE\u标志中定义,您可以覆盖/更改它们,例如使用示例中的代码段:

set_source_files_properties( 
    hello.c 
    PROPERTIES
    COMPILE_FLAGS -O0 
)

参考资料


我刚刚强制CMake进行调试,敲打选项,然后手动滚动文件并添加标志。否定了CMake的许多优点…@CameronLowellPalmer问题是为什么需要从编译器的命令行中删除前导的
-O3
选项,因为:。它假定gcc或gcc兼容,这可能也适用于clang,但肯定不是您可以依赖的。对于一个大型复杂的跨平台项目,我认为您需要处理这个问题,以使标志完全符合您的要求。在我熟悉的项目中,不正确的编译会严重损害功能。很遗憾,您不能覆盖单个文件。@CameronLowellPalmer我添加了一些CMake代码,这些代码确实满足了您的要求。但在将来的版本中,最好将“在源代码级别覆盖编译器标志”作为一项功能实现。