如何使用 CMake 创建包
How to Create Packages with CMake
.
+-- MyPack
| +-- Lib1
| | +-- include
| | | +-- Lib1.h
| | +-- src
| | | +-- Lib2.cpp
| | +-- CMakeLists.txt
| +-- Lib2
| | +-- include
| | | +-- Lib2.h
| | +-- src
| | | +-- Lib2.cpp
| | +-- CMakeLists.txt
| +-- CMakeLists.txt
+-- SubProject1
| +-- CMakeLists.txt
+-- SubProject2
| +-- CMakeLists.txt
+-- CMakeLists.txt
大家好。
我是 CMake 的新手,我正在尝试获取如下内容。
考虑到我的 C++ 项目的上述目录树:
我有一个目录(比方说 "MyPack"),其中包含多个子目录(Lib1、Lib2...),每个子目录代表我编写的一个 C++ 库。
如何设置所有内容以便我可以在其他子项目中编写 find_package(MyPack)
?
每个子项目都是一个独立的项目,不依赖于其他子项目,只依赖于"MyPack"中的库。
你的图有点乱,因为Lib2后面有一个CMakeLists.txt不属于任何文件夹...
无论如何:是 MyPack
- Lib1 和 Lib2?
- Lib1/Lib2/Subproj1/Subproj2 ?
第二种情况:
顶级目录 CMakeLists.txt 使您可以访问 Lib1 和 Lib2 的目标,如果您有类似这样的东西,您可以在 SubProject1 和 SubProject2 中使用这些目标:
project(MyPack)
add_subdirectory(Lib1) # Building Lib1
add_subdirectory(Lib2) # Building Lib2
add_subdirectory(SubProject1) # you can use Lib1 & Lib2 targets here
add_subdirectory(SubProject2) # you can use Lib1 & Lib2 targets here
如果是第一种情况,MyPack只有Lib1和Lib2:
使用find_package(MyPack) 意味着您需要创建一个配置文件并安装()您的项目:
project(MyPack)
add_subdirectory(Lib1)
add_subdirectory(Lib2)
在 Lib1/CMakeLists.txt 中:
add_library(lib1 "")
add_library(MyPack::lib1 ALIAS lib1)
[...]
include(GNUInstallDirs)
install(
TARGET lib1
EXPORT MyPackTargets
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
)
在 Lib2/CMakeLists.txt 中:
add_library(lib2 "")
add_library(MyPack::lib2 ALIAS lib2)
[...]
include(GNUInstallDirs)
install(
TARGET 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 # Not sure if this is still needed
)
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 Config and ConfigVersion files
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/
希望对您有所帮助
.
+-- MyPack
| +-- Lib1
| | +-- include
| | | +-- Lib1.h
| | +-- src
| | | +-- Lib2.cpp
| | +-- CMakeLists.txt
| +-- Lib2
| | +-- include
| | | +-- Lib2.h
| | +-- src
| | | +-- Lib2.cpp
| | +-- CMakeLists.txt
| +-- CMakeLists.txt
+-- SubProject1
| +-- CMakeLists.txt
+-- SubProject2
| +-- CMakeLists.txt
+-- CMakeLists.txt
大家好。
我是 CMake 的新手,我正在尝试获取如下内容。 考虑到我的 C++ 项目的上述目录树:
我有一个目录(比方说 "MyPack"),其中包含多个子目录(Lib1、Lib2...),每个子目录代表我编写的一个 C++ 库。
如何设置所有内容以便我可以在其他子项目中编写 find_package(MyPack)
?
每个子项目都是一个独立的项目,不依赖于其他子项目,只依赖于"MyPack"中的库。
你的图有点乱,因为Lib2后面有一个CMakeLists.txt不属于任何文件夹... 无论如何:是 MyPack
- Lib1 和 Lib2?
- Lib1/Lib2/Subproj1/Subproj2 ?
第二种情况:
顶级目录 CMakeLists.txt 使您可以访问 Lib1 和 Lib2 的目标,如果您有类似这样的东西,您可以在 SubProject1 和 SubProject2 中使用这些目标:
project(MyPack)
add_subdirectory(Lib1) # Building Lib1
add_subdirectory(Lib2) # Building Lib2
add_subdirectory(SubProject1) # you can use Lib1 & Lib2 targets here
add_subdirectory(SubProject2) # you can use Lib1 & Lib2 targets here
如果是第一种情况,MyPack只有Lib1和Lib2:
使用find_package(MyPack) 意味着您需要创建一个配置文件并安装()您的项目:
project(MyPack)
add_subdirectory(Lib1)
add_subdirectory(Lib2)
在 Lib1/CMakeLists.txt 中:
add_library(lib1 "")
add_library(MyPack::lib1 ALIAS lib1)
[...]
include(GNUInstallDirs)
install(
TARGET lib1
EXPORT MyPackTargets
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
)
在 Lib2/CMakeLists.txt 中:
add_library(lib2 "")
add_library(MyPack::lib2 ALIAS lib2)
[...]
include(GNUInstallDirs)
install(
TARGET 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 # Not sure if this is still needed
)
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 Config and ConfigVersion files
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/
希望对您有所帮助