我想使用 CMake 创建模块化嵌入式 C++ 软件。我分离了 hal-drivers
静态库,一些 common-utils
库和顶级目标 device
取决于这两个使用 target_link_libraries
标记的内容,如下所示:
target_link_libraries(device
PRIVATE
hal-drivers
common-utils
)
使用如下命令可以很容易地在“依赖阶梯”中向上传播编译定义和选项:
target_compile_definitions(hal-drivers
INTERFACE
STM32F415xx
USE_HAL_DRIVER
)
这样任何使用 hal-drivers
头文件的目标都会正确地预处理这些头文件,我发现这个 CMake 脚本功能(“设置”的传播)很棒,但这不是这个问题的重点。
问题是我应该如何为项目中的每个目标传播常见的编译器选项,例如 -fdata-sections
或 -Wall
?我知道我可以
CMakeLists.txt
中的通用编译选项设置为缓存变量,然后手动将此变量应用于所有目标,但我们不喜欢它请记住:我确实有可行的解决方案,我对推荐的解决方案感兴趣。此外,我每天都在使用 Professional CMake: A Practical Guide 9th Edition
(这是一本好书),但我未能在这本书中找到我的问题的答案。
答案 0 :(得分:0)
我找到了答案。
我想我对缺乏优雅解决方案的抱怨是由于我对 target_compile_options
等语法糖的依恋,但问题是 CMake 在艰难中进化,并不是每个 CMake 功能都很漂亮,但它有效。
有一个答案:https://cmake.org/cmake/help/latest/variable/CMAKE_LANG_FLAGS.html
The flags in this variable will be passed to the compiler before those in the per-configuration CMAKE_<LANG>_FLAGS_<CONFIG> variant, and before flags added by the add_compile_options() or target_compile_options() commands.
所以我必须像这样将我的自定义选项附加到这个特殊的 CMake 变量中:
project(Device C CXX ASM)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fdata-sections")
这样它就会用 fdata-sections
淹没所有目标。
留下这个帖子作为有趣的笔记。