gpt4 book ai didi

c++ - 如何将编译选项传播到 CMake 中的子目录?

转载 作者:行者123 更新时间:2023-12-05 01:53:55 24 4
gpt4 key购买 nike

在我的项目中,我有一个根 CMakeLists.txt,它定义了一些可执行文件。我使用 target_compile_options 配置一些设置,例如这些可执行文件的警告。我有一些子目录可以编译一些库以与可执行文件链接。如何在不重新定义每个子目录 CMakeLists.txt 中的编译选项的情况下,将编译选项从根 CMakeLists.txt 传播到子目录中的依赖项?

例如,这是我的根 CMakeLists.txt

的简化版本
cmake_minimum_required(VERSION 3.8)

project(proj)

enable_language(C ASM)
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS OFF)

add_subdirectory(src/lib/somelib)

add_executable(my_executable src/app/main.c)
target_compile_options(my_executable PUBLIC -Wpedantic) # as an example
target_link_libraries(my_executable PRIVATE somelib)

src/lib/somelib 中的 CMakeLists.txt

add_library(somelib somelib.c)
target_include_directories(somelib PUBLIC .)

在此示例中,我希望使用根 CMakeLists.txt 中的任何编译选项编译 somelib.c

最佳答案

警告标志位于 CMakePresets.json 或自定义工具链文件中。只有硬性使用要求属于 CMakeLists.txt 文件。您成功编译的代码与您使用的警告无关。

此外,您通常应该在整个项目中始终如一地应用警告标志。不要使用构建系统来掩埋代码中的问题。如果您的编译器抛出误报,请添加特定于编译器的编译指示(根据需要由必要的 ifdef 保护)以在本地禁用围绕有问题的代码的警告。

这是我编写顶级 CMakeLists.txt 的方式

cmake_minimum_required(VERSION 3.21)
project(proj LANGUAGES C ASM)

set(CMAKE_C_STANDARD 11
CACHE STRING "Version of the C standard to use")
option(CMAKE_C_STANDARD_REQUIRED "Enable to enforce strict C standard selection" ON)
option(CMAKE_C_EXTENSIONS "Enable to allow compiler-specific C extensions" OFF)

add_subdirectory(src/lib/somelib)

add_executable(my_executable src/app/main.c)
target_link_libraries(my_executable PRIVATE somelib)

在 CMakePresets.json 中:

{
"version": 3,
"cmakeMinimumRequired": {
"major": 3,
"minor": 21,
"patch": 0
},
"configurePresets": [
{
"name": "default",
"displayName": "Default",
"description": "Default build options for GCC-compatible compilers",
"binaryDir": "${sourceDir}/build",
"cacheVariables": {
"CMAKE_C_FLAGS": "-Wall -Wextra -pedantic"
}
}
]
}

编译

$ cmake --preset default

我已经在其他地方写过这样做的理由,所以我会发布这些引用资料的链接。

  1. https://alexreinking.com/blog/how-to-use-cmake-without-the-agonizing-pain-part-2.html
  2. https://stackoverflow.com/a/68094639/2137996

要点是警告标志的含义取决于编译器供应商、变体和版本,因此将它们放在 CMakeLists.txt 中会附加对这些东西的非常脆弱的依赖性。它使编译器升级和更改变得不必要地困难,并使您的构建更难分发和重用,即使在公司内部也是如此。


此外,您应该避免在 target_include_directories 中使用相对路径和库目标通常应使用 $<BUILD_INTERFACE:...> 保护它们的路径准备安装/导出。

target_include_directories(
somelib PUBLIC "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>")

关于c++ - 如何将编译选项传播到 CMake 中的子目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70933512/

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