c++ - 在对象库中包含 CMake 目标的 header

标签 c++ cmake conan

场景:

我正在将应用程序构建系统移植到 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 库上执行此操作。

我的问题:

  1. 如何在 OBJECT 库目标中包含 find_package() 和 CONAN_PKG 提供的 CMake 目标 header ?
  2. 有没有更好/更好的方法来重用 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 .

关于c++ - 在对象库中包含 CMake 目标的 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59215604/

相关文章:

windows-installer - 在 CMake + CPack + NSIS 中创建 Windows 桌面图标

cmake - cmake 使用 macos 上的 makefile 生成器创建的 <target>.dSYM 目录中有什么?

c++ - C#WPF和C++/CLI和C++在C++/CLI中添加外部库错误

c++ - 如何使用柯南安装 Boost Property Tree?

c++ - 如何进行无分支数字循环?

android - Qt 5.2 和 Android 错误

c++ - 在 Cmake 中静态链接 Lua

c# - 将未知大小的结构数组从 c# 传递到 c++ dll 并返回

c++ - 解释 C++ 中的运算符重载

c++ - conan.io - 仅 header 包