gpt4 book ai didi

CMake 每个文件优化

转载 作者:行者123 更新时间:2023-12-03 19:36:46 27 4
gpt4 key购买 nike

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

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 上的文档

Additional flags to be added when compiling this source file.



这是有道理的,它被添加到 COMPILE_FLAGS 列表中,它不会覆盖现有的编译器标志。

因此,在 CMake 中,您如何覆盖单个文件的优化级别并能够在 Release 中编译项目的其余部分?否则你可以强制编译为 CMAKE_BUILD_TYPE=""这是默认行为,但这在某种程度上违背了 Cmake 的一个卖点。

最佳答案

你不能用 makefile 覆盖编译器选项源文件级别的 CMake 生成器。选项总是被附加(查看 my answer at Is Cmake set variable recursive? 以获得完整的公式)。

这是 - 据我所知 - 仅支持 Visual Studio解决方案/项目生成器。这些生成器有 flag tables识别同一组中的标志/覆盖先前定义的标志。

所以你的更像是一个功能请求,也将编译器选项表添加到 CMake 的 makefile发电机。

替代品

我只是想添加一些我想出的疯狂的 CMake 魔法作为解决方法。将以下内容添加到您的主要 CMakeLists.txtproject()命令:

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然后链接到 COMPILE_FLAGS 的目录属性源文件属性通过 define_property(... INHERITED ...) .

现在构建类型特定标志仅在 COMPILE_FLAGS 中定义对于每个源文件,您可以覆盖/更改它们,例如使用您示例中的代码片段:
set_source_files_properties( 
hello.c
PROPERTIES
COMPILE_FLAGS -O0
)

引用文献
  • Directory properties and subdirectories
  • CMake: How do I change properties on subdirectory project targets?
  • 关于CMake 每个文件优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47926404/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com