你的绘图有点混乱,因为在Lib2之后有一个CMakeLists.txt,它不属于任何文件夹...
不管怎样,是
MyPack
- Lib1和Lib2?
- Lib1/Lib2/Subproj1/Subproj2?
在第二种情况下:
顶层目录的CMakeLists.txt可以让你访问Lib1和Lib2的目标,如果你有类似这样的东西,你可以在SubProject1和SubProject2中使用它们:
project(MyPack)
add_subdirectory(Lib1)
add_subdirectory(Lib2)
add_subdirectory(SubProject1)
add_subdirectory(SubProject2)
如果是第一种情况,
MyPack 只是 Lib1 和 Lib2:
使用 find_package(MyPack) 意味着你需要创建一个 Config 文件并安装() 你的项目。
project(MyPack)
add_subdirectory(Lib1)
add_subdirectory(Lib2)
在Lib1/CMakeLists.txt文件中:
add_library(lib1 "")
add_library(MyPack::lib1 ALIAS lib1)
[...]
include(GNUInstallDirs)
install(
TARGETS lib1
EXPORT MyPackTargets
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
)
在Lib2/CMakeLists.txt中:
add_library(lib2 "")
add_library(MyPack::lib2 ALIAS lib2)
[...]
include(GNUInstallDirs)
install(
TARGETS lib2
EXPORT MyPackTargets
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
)
现在你在导出的MyPackTargets中有lib1和lib2。你还需要安装这个导出。在上述之后的任何地方都可以。
install(
EXPORT MyPackTargets
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/MyPack
NAMESPACE MyPack::
FILE MyPackTargets.cmake
)
include(CMakePackageConfigHelpers)
configure_package_config_file(
"Config.cmake.in"
"MyPackConfig.cmake"
INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/MyPack
PATH_VARS
CMAKE_INSTALL_LIBDIR
)
write_basic_package_version_file(
${CMAKE_CURRENT_BINARY_DIR}/MyPackConfigVersion.cmake
VERSION 1.0.0
COMPATIBILITY SameMajorVersion
)
install(
FILES "${CMAKE_CURRENT_BINARY_DIR}/MyPackConfig.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/MyPackConfigVersion.cmake"
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/MyPack"
)
创建一个名为Config.cmake.in的文件。
@PACKAGE_INIT@
include( "${CMAKE_CURRENT_LIST_DIR}/MyPackTargets.cmake" )
现在,如果你构建并安装了你的项目 MyPack,其他项目中的 find_package(MyPack) 应该能找到它并导入你创建的目标。
这里有一些文档:
https://cmake.org/cmake/help/latest/module/CMakePackageConfigHelpers.html
https://blog.kitware.com/cmake-superbuilds-git-submodules/
-DCMAKE_PREFIX_PATH=../../MyPack
。 - Guillaume Racicot