如何使用CMake创建包

eni9jsuy  于 7个月前  发布在  其他
关注(0)|答案(1)|浏览(76)
.
+-- 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”中的库。

gorkyyrv

gorkyyrv1#

您的绘图有点混乱,因为Lib 2后面有一个CMakeLists.txt,它不属于任何文件夹.

  • Lib 1和Lib 2?
  • Lib1/Lib2/Subproj1/Subproj2?

在第二种情况下:
顶部目录CMakeLists.txt让你可以访问Lib 1和Lib 2的目标,如果你有这样的东西,你可以在SubProject 1和SubProject 2中使用:

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仅为Lib 1和Lib 2:
使用find_package(MyPack)意味着你需要创建一个Config文件并install()你的项目:

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的导出中有了lib 1和lib 2,你也必须安装这个导出。
在上面的任何地方:

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/

相关问题