在 object 库中包含 header 个 CMake 目标

Include header of CMake targets in a object library

场景:

我正在将应用程序构建系统移植到 CMake。依赖项已经安装在系统上或将通过 conan 处理。

假设项目结构如下:

- include/
  - BigFoo/
    - *.hpp
- src/
  - BigFoo/
    - *.cpp
  - main.cpp
  - *.qml
- test/
  - BigFoo/
    - *Test.cpp

我的目标是在主应用程序和单元测试中重用 BigFoo 的编译输出 (*.o)。我不想要 BigFoo 的内部库(*.a 或 *.so)。

BigFoo 正在使用目标系统中的 Qt5 和 Boost 组件。它还使用作为柯南包提供的组件。

当前方法:

期望的方法:

所需方法的问题:

在构建 OBJECT 图书馆.

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 库上执行此操作没有 link 任何东西。

我的问题:

  1. 如何在 OBJECT 库目标中包含 header 由 find_package() 和 CONAN_PKG 提供的 CMake 目标?
  2. 是否有 better/nicer 重用 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
)

Object libraries may be used as the target (first) argument of target_link_libraries to specify dependencies of their sources on other libraries.