Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在对象库中包含CMake目标的标头_C++_Cmake_Conan - Fatal编程技术网

C++ 在对象库中包含CMake目标的标头

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)

场景:

我正在将一个应用程序构建系统移植到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构建为对象库=>include dependency header
  • 使用BigFoo\u对象=>链接依赖关系构建main.cpp、*.qml
  • 使用BigFoo\u对象=>链接依赖项构建BigFoo/*Test.cpp
所需方法的问题:

在构建对象库时,我无法通过target_include_directories()包含几个组件(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(当然)添加了如下所示的头包含路径

-I../../../Application/Qt5::Qml
之后失败,因为它无法删除Qt include语句

在构建静态库时,头include是由target_link_libraries()处理的,我现在有点困惑如何在不链接任何内容的对象库上执行此操作

我的问题:

  • 如何在对象库目标中包含find_package()和CONAN_PKG提供的CMake目标的标题
  • 有没有更好/更好的方法重用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配置期间?另外,您使用哪个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
    还不允许应用于对象库?