场景:
我正在将应用程序构建系统移植到 CMake。依赖项已安装在系统上或将通过 conan 处理。
假设项目结构如下:
- include/
- BigFoo/
- *.hpp
- src/
- BigFoo/
- *.cpp
- main.cpp
- *.qml
- test/
- BigFoo/
- *Test.cpp
我的目标是在主应用程序和单元测试中重用 BigFoo 的编译输出 (*.o)。我不想要 BigFoo 的内部库(*.a 或 *.so)。
BigFoo 正在使用目标系统中的 Qt5 和 Boost 组件。它还使用作为 conan 包提供的组件。
当前方法:
- 将 BigFoo 构建为静态库 => 通过 target_link_library() 处理依赖关系
- 构建 main.cpp 和 *.qml => 与 BigFoo 链接
- 构建 BigFoo/*Test.cpp => 与 BigFoo 链接
所需的方法:
- 将 BigFoo 构建为对象库 => 包含依赖项 header
- 使用 BigFoo_Object 构建 main.cpp、*.qml => 链接依赖项
- 使用 BigFoo_Object 构建 BigFoo/*Test.cpp => 链接依赖项
所需方法的问题:
在构建 OBJECT 库时,我无法通过 target_include_directories() 包含多个组件的依赖 header (Boost::XYZ Qt5::XYZ CONAN_PKG::XYZ 等)。
add_library(Core OBJECT)
# I want to do something like this:
target_include_directories(Core PUBLIC
Qt5::Core
Qt5::Qml
Qt5::Quick
Qt5::Scxml
CONAN_PKG::XYZ
CONAN_PKG::XYZ
)
结果是 CMake(当然)添加了如下所示的 header 包含路径...
-I../../../Application/Qt5::Qml
并且稍后失败,因为它无法拆除 Qt include 语句。
在构建静态库时, header 包含由 target_link_libraries() 处理,我现在有点困惑如何在我不链接任何内容的 OBJECT 库上执行此操作。
我的问题:
- 如何在 OBJECT 库目标中包含 find_package() 和 CONAN_PKG 提供的 CMake 目标 header ?
- 有没有更好/更好的方法来重用 BigFoo,这样我就没有重复的编译?
PS: 我使用的是 cmake 3.13
最佳答案
我知道这似乎是无稽之谈,因为对象库根本没有链接。但这只是 CMake 对象库的尴尬之一。这就是您可能需要的:
add_library(Core OBJECT)
target_link_libraries(Core PUBLIC
Qt5::Core
Qt5::Qml
Qt5::Quick
Qt5::Scxml
CONAN_PKG::XYZ
CONAN_PKG::XYZ
)
关于c++ - 在对象库中包含 CMake 目标的 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59215604/