【发布时间】:2020-02-13 21:06:58
【问题描述】:
我有一个非常复杂的基于make 的项目,我正在尝试迁移到现代 CMake 用法。在Makefile 中,我有几个类似的共享库目标,它们共享大部分相同的编译标志。所以,它看起来像这样:
add_library(lib1 SHARED src1.cpp src2.cpp)
target_compile_options(lib1 PUBLIC -public-flag1 -public-flag2 -unique-flag3 PRIVATE -private-flag)
add_library(lib2 SHARED src3.cpp src4.cpp)
target_compile_options(lib2 PUBLIC -public-flag -public-flag2 PRIVATE -private-flag)
有什么方法可以抽象出常见的依赖关系,这样我就不必在每个目标下重复它们了?似乎Interface Library 将是执行此操作的方法,例如:
add_library(common_options INTERFACE)
target_compile_options(common_options
PUBLIC -public-flag1 -public-flag2
PRIVATE -private-flag
)
add_library(lib1 SHARED src1.cpp src2.cpp)
target_compile_options(lib1 PUBLIC -unique-flag3)
target_link_libraries(lib1 common_options)
add_library(lib2 SHARED src3.cpp src4.cpp)
target_link_libraries(lib1 common_options)
在我看来,这将是可维护性的净赢。但是,CMake 会抛出一个错误,抱怨接口目标只能携带 INTERFACE 选项(我无法向其添加 PRIVATE 选项)。是否有其他方法可以让我封装目标之间共享的 PUBLIC 和 PRIVATE 标志?
【问题讨论】:
-
你不能将变量设置为你想要的任何东西并在调用
target_compile_options时扩展它 -
或者您可以编写一个函数/宏来创建一个库并设置公共属性。