方案:

我正在将应用程序构建系统移植到CMake。依赖关系已安装在系统上,或将通过柯南处理。

可以说该项目的结构如下:

- 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 =>链接
  • 使用BigFoo
  • 构建BigFoo / * Test.cpp =>链接

    所需方法:
  • 将BigFoo构建为对象库=>包括依赖项头
  • 使用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语句。

    当构建一个静态库时,头文件包括是由target_link_libraries()处理的,我现在有点困惑如何在不链接任何对象的OBJECT库中执行此操作。

    我的问题:
  • 如何在对象库目标中包含由find_package()和CONAN_PKG提供的CMake目标的 header ?
  • 是否有重复使用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

    10-07 15:23