方案:
我正在将应用程序构建系统移植到CMake。依赖关系已安装在系统上,或将通过柯南处理。
可以说该项目的结构如下:
- include/
- BigFoo/
- *.hpp
- src/
- BigFoo/
- *.cpp
- main.cpp
- *.qml
- test/
- BigFoo/
- *Test.cpp
我的目标是在主应用程序和单元测试中重用BigFoo的编译输出(* .o)。我不需要BigFoo的内部库(* .a或* .so)。
BigFoo正在使用目标系统中的Qt5和Boost组件。它还使用作为柯南软件包提供的组件。
当前方法:
所需方法:
所需方法的问题:
构建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语句。
当构建一个静态库时,头文件包括是由target_link_libraries()处理的,我现在有点困惑如何在不链接任何对象的OBJECT库中执行此操作。
我的问题:
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。