cmake - 良好的 CMake 风格:继承属性
问题描述
Daniel Pfeifer 在他的演讲“Effective CMake”中指出,建议尽可能避免变量定义。
现在,如何将属性添加到各种构建目标中。也就是说,例如
target_include_directories(base_IncludeFlags
INTERFACE
first/dir
second/dir
...)
定义了一组包含目录。我不想为 、 和 定义完全相同的包含目录,而是让这些目标target_a
从target_b
“ base_target
”继承包含目录,例如target_c
target_link_libraries(target_a PUBLIC base_IncludeFlags)
target_link_libraries(target_b PUBLIC base_IncludeFlags)
target_link_libraries(target_c PUBLIC base_IncludeFlags)
where base_IncludeFlags
is 不应该是一个真正的物理目标,而是一个抽象基类或接口之类的东西。
另一方面,我不想使用,include_directories
因为这会影响所有目标。是不是更好用foreach
?最优雅的方法是什么?我应该创建base_target
一个库并添加依赖项吗?
解决方案
我想要的是一个实际上不是物理产生的目标,但它传播了一些常见的属性。
正是为了这个目的,CMake 有INTERFACE 库- 不同属性的容器,当这个库链接到另一个目标时,这些属性会被传播。
例子:
# 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.
推荐阅读
- android - 在 EnryptedSharedPreferences 中保存 CharArray
- android - Ionic/Angular + Firebase 与 Android 设备上的模拟器 = auth/network-request-failed
- visual-studio-code - Blazor WASM 独立调试停止工作
- javascript - 根据您对 Discord.js 做出反应的表情符号做一些事情
- android - 在预构建事件中设置 Visual Studio 中的 BuildAction
- python - Python 无法从 API 响应中删除文本
- java - 部署到 jboss EAP 7.1 时,此 URL 不支持 HTTP Post 方法
- bluetooth - 从 BLE 设备接收数据到树莓派 Pi3
- swift - 如何使用 Swift 每周一使用 AVAudioPlayer 播放声音?
- java - Groovy v3.0.7 不支持静态接口方法