【问题标题】:Linking two separate cmake projects where one is dependant on the other链接两个独立的 cmake 项目,其中一个依赖于另一个
【发布时间】:2020-11-17 19:30:25
【问题描述】:

我有两个独立的项目,A 和 B。它们都有很大的文件夹结构、很多依赖项,并且都有自己的 CMakelists.txt 结构。既不相互依赖。 我正在向项目 A 添加新功能,该功能依赖于项目 B 的标头,以及标头所依赖的项目 B 中的文件网络。 我不知道将这些与cmake联系起来的正确方法。我在代码中必要的地方添加了标题作为包含,但不确定链接它的正确方法。我是使用 target_include_directories 并添加项目 B 中的二进制文件,还是源代码,或者两者都添加?项目 A 不会构建 B,因为它已经设置好了,二进制文件和源代码位于单独的子目录中。我只需要 A 能够从 B 调用功能。 我对cmake还不是很熟悉,所以任何指针都将不胜感激。 谢谢。

【问题讨论】:

    标签: c++ cmake qt-creator


    【解决方案1】:

    项目 B 应导出其目标。

    这样,在项目 A 中,您可以执行以下操作:

    find_package(B REQUIRED)
    target_link_libraries(A PUBLIC B::B)
    

    并且在调用CMake时,在前缀路径中添加B的构建目录:

    # in A/build
    cmake .. -DCMAKE_PREFIX_PATH=/path/to/B/build
    

    但为了使其正常工作,您必须更改您的 B CMake 文件以导出您的目标(应该如此):

    include(GNUInstallDirs)
    
    add_library(B INTERFACE)
    add_library(B::B ALIAS B)
    
    target_link_libraries(B PUBLIC dependency-of-B)
    target_compile_features(B INTERFACE cxx_std_17) # or any language version
    
    # Set B include directory. Will add include directory for both B and A
    target_include_directories(B PUBLIC
        $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/your-include-dir>
    )
    
    file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/cmake/B-config.cmake" DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
    install(TARGETS B EXPORT B-targets)
    # install package
    install(EXPORT B-targets
        FILE B-targets.cmake
        NAMESPACE B::
        DESTINATION share/cmake/B
    )
    # export build tree
    export(
        EXPORT B-targets
        FILE "${CMAKE_CURRENT_BINARY_DIR}/B-targets.cmake"
        NAMESPACE B::
    )
    

    与B-config.cmake:

    include(CMakeFindDependencyMacro)
    
    # All find_package we used in CMakeLists.txt should also be there
    find_dependency(dependency1 REQUIRED)
    find_dependency(dependency2 REQUIRED)
    
    include("${CMAKE_CURRENT_LIST_DIR}/B-targets.cmake")
    

    如果你在B中有很多目标,你应该install(TARGETS other-target EXPORT B-targets)

    我强烈建议您查看导出目标的库示例,以便您可以在此基础上开展工作。例如,glm 库导出其目标并且始终运行良好。我还添加了target exportation in msdfgen project。

    【讨论】:

      【解决方案2】:

      如果您只想使用标头而不是目标文件,那么您只需要target_include_directories。依赖跟踪将由 cmake 和 ninja/make 自动完成。

      或者,如果您需要包含 B 中的标头和对象,您真的希望将这些位分解到 B 中的小型独立静态库中,然后与 A 中的这些库链接 - 这将添加包含文件路径和其他需要的东西。 cmake 很擅长。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-30
        • 2010-12-10
        • 1970-01-01
        • 1970-01-01
        • 2011-05-26
        相关资源
        最近更新 更多