我在顶层 CmakeList.txt 中包含了 cmake 模块:
# Generate and install package config files
include(PackageConfigInstall)
在通用 PackageConfigInstall.cmake 文件中,配置文件是从 cmake.in 文件创建并安装的。这个模块可以被其他包重用。
include(CMakePackageConfigHelpers)
# Generate package config cmake files
set(${PACKAGE_NAME}_LIBRARY_NAME ${CMAKE_SHARED_LIBRARY_PREFIX}${PACKAGE_NAME}${CMAKE_STATIC_LIBRARY_SUFFIX})
configure_package_config_file(${PACKAGE_NAME}-config.cmake.in
${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE_NAME}-config.cmake
INSTALL_DESTINATION ${CMAKE_INSTALL_DIR}/${PACKAGE_NAME}
PATH_VARS LIB_INSTALL_DIR INCLUDE_INSTALL_DIR APP_INCLUDE_INSTALL_DIR )
configure_file(${PACKAGE_NAME}-config-version.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE_NAME}-config-version.cmake @ONLY)
# Install package config cmake files
install(
FILES
${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE_NAME}-config.cmake
${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE_NAME}-config-version.cmake
DESTINATION
${CMAKE_INSTALL_DIR}/${PACKAGE_NAME}
COMPONENT
devel
)
您需要为您的库提供一个包文件,例如 your_lib-config.cmake.in,它将成为 your_lib-config.cmake。这将包含可以使用的包含变量和库变量。
get_filename_component(YOUR_LIB_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)
# flag required by CMakePackageConfigHelpers
@PACKAGE_INIT@
set_and_check(YOUR_LIB_INCLUDE_DIR @PACKAGE_YOUR_LIB_INCLUDE_INSTALL_DIR@/hal)
set_and_check(YOUR_LIB_LIBRARY @PACKAGE_LIB_INSTALL_DIR@/@CMAKE_STATIC_LIBRARY_PREFIX@@PROJECT_NAME_LIB@@CMAKE_STATIC_LIBRARY_SUFFIX@)
set_and_check(YOUR_LIB_LIBRARIES @PACKAGE_LIB_INSTALL_DIR@/@CMAKE_STATIC_LIBRARY_PREFIX@@PROJECT_NAME_LIB@@CMAKE_STATIC_LIBRARY_SUFFIX@)
您还需要一个像这样的 config-version.cmake.in 文件:
set(PACKAGE_VERSION @PACKAGE_VERSION@)
# Check whether the requested PACKAGE_FIND_VERSION is compatible
if("${PACKAGE_VERSION}" VERSION_LESS "${PACKAGE_FIND_VERSION}")
set(PACKAGE_VERSION_COMPATIBLE FALSE)
else()
set(PACKAGE_VERSION_COMPATIBLE TRUE)
if ("${PACKAGE_VERSION}" VERSION_EQUAL "${PACKAGE_FIND_VERSION}")
set(PACKAGE_VERSION_EXACT TRUE)
endif()
endif()
打包脚本需要做很多工作才能使其正常工作。我经历了很多试验和错误,最终得到了适用于不同目标(Linux 服务器和嵌入式目标)的东西。我可能遗漏了一些东西,所以请发表评论,我会更新答案。