C++ 在对象库中包含CMake目标的标头
场景: 我正在将一个应用程序构建系统移植到CMake。依赖项已安装在系统上,或将通过conan处理 假设项目的结构如下所示:C++ 在对象库中包含CMake目标的标头,c++,cmake,conan,C++,Cmake,Conan,场景: 我正在将一个应用程序构建系统移植到CMake。依赖项已安装在系统上,或将通过conan处理 假设项目的结构如下所示: - include/ - BigFoo/ - *.hpp - src/ - BigFoo/ - *.cpp - main.cpp - *.qml - test/ - BigFoo/ - *Test.cpp 我的目标是在主应用程序和单元测试中重用BigFoo的编译输出(*.o)。我不想要BigFoo的内部库(*.a或*.so)
- 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构建为对象库=>include dependency header
- 使用BigFoo\u对象=>链接依赖关系构建main.cpp、*.qml
- 使用BigFoo\u对象=>链接依赖项构建BigFoo/*Test.cpp
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(当然)添加了如下所示的头包含路径
-I../../../Application/Qt5::Qml
之后失败,因为它无法删除Qt include语句
在构建静态库时,头include是由target_link_libraries()处理的,我现在有点困惑如何在不链接任何内容的对象库上执行此操作
我的问题:
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配置期间?另外,您使用哪个CMake版本,
对象
库在较新版本中有更好的支持。您是否在CMakeLists.txt中包含了conan_basic_设置(目标)?CONAN_PKG只有在您选择Target时才会导出谢谢您的提示,我已经更新了问题。是的,我正在使用CONAN_basic_安装程序上的TARGETS标志。我还检查了生成的conan*.cmake文件。所有需要的依赖项都导出为接口+导入库。谢谢!我从来没有想到这个函数是对象库上下文中名为“link”的函数的一部分。对于其他人:这会将传递的目标中的所有include目录添加到compile命令中,并使用“-issystem”表示欢迎。并且target_link_libraries()始终添加导入目标的include目录,而不仅仅是对象库。当您的依赖项被导入目标时,您也可以避免可执行文件和共享库的目标目录()。如何在CMake 3.10上做到这一点?CMake 3.10是Ubuntu 18.04附带的,其中target\u link\u libraries
还不允许应用于对象库?