项目 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。