在 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 组件。它还使用作为柯南包提供的组件。
当前方法:
- 将 BigFoo 构建为静态库 => 通过 target_link_library()
处理依赖项
- 使用 BigFoo
构建 main.cpp 和 *.qml => link
- 构建 BigFoo/*Test.cpp => link 与 BigFoo
期望的方法:
- 将 BigFoo 构建为 object 库 => 包含依赖项 headers
- 使用 BigFoo_Object => link 依赖项
构建 main.cpp, *.qml
- 使用 BigFoo_Object => link 依赖项
构建 BigFoo/*Test.cpp
所需方法的问题:
在构建 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 任何东西。
我的问题:
- 如何在 OBJECT 库目标中包含 header 由 find_package() 和 CONAN_PKG 提供的 CMake 目标?
- 是否有 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
)
场景:
我正在将应用程序构建系统移植到 CMake。依赖项已经安装在系统上或将通过 conan 处理。
假设项目结构如下:
- include/
- BigFoo/
- *.hpp
- src/
- BigFoo/
- *.cpp
- main.cpp
- *.qml
- test/
- BigFoo/
- *Test.cpp
我的目标是在主应用程序和单元测试中重用 BigFoo 的编译输出 (*.o)。我不想要 BigFoo 的内部库(*.a 或 *.so)。
BigFoo 正在使用目标系统中的 Qt5 和 Boost 组件。它还使用作为柯南包提供的组件。
当前方法:
- 将 BigFoo 构建为静态库 => 通过 target_link_library() 处理依赖项
- 使用 BigFoo 构建 main.cpp 和 *.qml => link
- 构建 BigFoo/*Test.cpp => link 与 BigFoo
期望的方法:
- 将 BigFoo 构建为 object 库 => 包含依赖项 headers
- 使用 BigFoo_Object => link 依赖项 构建 main.cpp, *.qml
- 使用 BigFoo_Object => link 依赖项 构建 BigFoo/*Test.cpp
所需方法的问题:
在构建 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 任何东西。
我的问题:
- 如何在 OBJECT 库目标中包含 header 由 find_package() 和 CONAN_PKG 提供的 CMake 目标?
- 是否有 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
)