使用cmake写一个可被其他cmake文件find_package()调用的包,不自己写.cmake.in文件
时间: 2023-07-18 22:08:57 浏览: 139
open3d-cmake-find-package
如果你不想自己写 `MyPackageConfig.cmake.in` 文件,也不想使用 CMake 自带的 `configure_package_config_file()` 函数来自动生成配置文件,还有一种更简单的方法,即使用 `target_export_cmake()` 函数。
下面是一个示例 `CMakeLists.txt` 文件,其中使用了 `target_export_cmake()` 函数:
```cmake
cmake_minimum_required(VERSION 3.5)
project(MyPackage VERSION 1.0.0 LANGUAGES CXX)
# 设置包的安装路径
if(NOT CMAKE_INSTALL_PREFIX)
set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install" CACHE PATH "Install path prefix" FORCE)
endif()
# 添加头文件路径
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
# 添加源码路径
add_subdirectory(src)
# 安装包的头文件
install(
DIRECTORY
"${CMAKE_CURRENT_SOURCE_DIR}/include/"
DESTINATION include
)
# 导出包的编译目标
install(
EXPORT MyPackageTargets
FILE MyPackageTargets.cmake
NAMESPACE MyPackage::
DESTINATION lib/cmake/MyPackage
)
# 安装包的配置文件和版本文件
include(CMakePackageConfigHelpers)
write_basic_package_version_file("${CMAKE_CURRENT_BINARY_DIR}/MyPackageConfigVersion.cmake"
VERSION ${PROJECT_VERSION}
COMPATIBILITY AnyNewerVersion)
install(
FILES
"${CMAKE_CURRENT_SOURCE_DIR}/MyPackageConfig.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/MyPackageConfigVersion.cmake"
DESTINATION lib/cmake/MyPackage
)
# 生成导出文件
include(GenerateExportHeader)
generate_export_header(MyPackage)
# 导出头文件和导出文件
install(
DIRECTORY
"${CMAKE_CURRENT_SOURCE_DIR}/include/"
DESTINATION include
)
install(
FILES
"${CMAKE_CURRENT_BINARY_DIR}/my_package_export.h"
DESTINATION include
)
# 导出库文件和头文件路径
target_export_cmake(MyPackage MyPackageTargets "${CMAKE_CURRENT_BINARY_DIR}/MyPackageConfig.cmake" MyPackage_INCLUDE_DIRS)
```
在这个示例中,使用了 `generate_export_header()` 函数来生成导出文件,并且使用了 `target_export_cmake()` 函数来导出库文件和头文件路径,以及生成导出文件的路径。这种方法不需要手动编写 `MyPackageConfig.cmake.in` 文件,而是在 `MyPackageConfig.cmake` 文件中直接设置变量。
使用这种方法创建的包的使用方式与前两种方法相同,可以使用 `find_package()` 函数来调用该包。
阅读全文