Daniel Pfeifer在他的演讲“有效的CMake”中, 指出,建议避免变数 尽可能的定义。
现在,如何将属性添加到各种构建中 目标。也就是说,例如
target_include_directories(base_IncludeFlags
INTERFACE
first/dir
second/dir
...)
定义一组包含目录。而不是定义
与target_a
,target_b
,
和target_c
,我想让这些目标继承
来自“ base_target”的包含目录,类似
target_link_libraries(target_a PUBLIC base_IncludeFlags)
target_link_libraries(target_b PUBLIC base_IncludeFlags)
target_link_libraries(target_c PUBLIC base_IncludeFlags)
base_IncludeFlags
不是真实的物理目标,
类似于抽象基类或界面。
另一方面,我不想使用include_directories
因为这会影响所有目标。使用foreach
更好吗?
最优雅的方法是什么?我可以做base_target
吗
一个库并添加依赖项?
答案 0 :(得分:2)
我想要的是一个实际上不是物理产生的目标,但是可以传播一些共同的属性。
正是出于这个目的,CMake具有INTERFACE library-不同属性的容器,当该库链接到另一个目标时,这些属性就会传播。
示例:
# Create "container" target
add_library(base_target INTERFACE)
# Add some INTERFACE properties for that target
target_include_directories(base_target INTERFACE
first/dir
second/dir)
# Some 'other_target' (library or executable) may easily consume all common properties:
target_link_libraries(other_target PUBLIC base_target)
# Now 'other_target' has aforementioned include directories too.
# Instead of PUBLIC other linking types (PRIVATE, INTERFACE) may be used.
答案 1 :(得分:1)
最优雅的方法是什么?
请考虑,不是CMake专家的人经常阅读和编辑CMake文件。与其追求优雅,不如考虑简化:保持简单,愚蠢。
如果您引入抽象,任何形式的隐藏隐式行为,则每个人都将很难维护CMake文件。
对我来说,在这种情况下,简单的表示复制(复制)条目(如果只有2-3个)。如果有更多的库,我会将标头放在一个变量中。 “有效CMake”演示着重说明了避免不必要的一次性变量定义。我认为此标题列表将是一个有用的变量,值得创建。