链接两个独立的cmake项目,其中一个依赖于另一个



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

项目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库导出其目标,并且始终运行良好。我还在msdfgen项目中添加了目标输出。

如果只想使用头文件而不想使用对象文件,那么只需要target_include_directories即可。依赖性跟踪将由cmake和ninja/make自动完成。

或者,如果你需要同时包含B中的头和对象,你真的想把这些位分解到B中的小型独立静态库中,然后从A中链接到这些库——这将添加包含文件路径和其他所需的一切。cmake非常擅长。

最新更新