CMake export 命令以及 install 命令

1. export 导出一个库

export命令用于导出一个库,导出的库可以被其他项目使用。如下cmake命令生成库gcFactSystem,并导出库以及库的头文件(使用PUBLIC)。

set(target_name "gcFactSystem")
# compile library gcFactSystem

# export library gcFactSystem to gcFactSystemConfig.cmake
target_include_directories(${target_name} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/validator)
export(TARGETS ${target_name} FILE "${CMAKE_CURRENT_BINARY_DIR}/${target_name}Targets.cmake")

生成gcFactSystemTargets.cmake,里面包含了目标库,以及头文件包含路径:

set_target_properties(gcFactSystem PROPERTIES
  INTERFACE_INCLUDE_DIRECTORIES "D:/work/ground_station/dev/jhatcgcs/src/FactSystem;D:/work/ground_station/dev/jhatcgcs/src/FactSystem/validator"
  INTERFACE_SOURCES "\$<\$<BOOL:\$<TARGET_PROPERTY:QT_CONSUMES_METATYPES>>:D:/work/ground_station/dev/jhatcgcs/build/src/FactSystem/meta_types/qt6gcfactsystem_debug_metatypes.json>"
)

set_target_properties(gcFactSystem PROPERTIES
  IMPORTED_IMPLIB_DEBUG "D:/work/ground_station/dev/jhatcgcs/bin/gcFactSystem.lib"
  IMPORTED_LINK_DEPENDENT_LIBRARIES_DEBUG "Qt6::Core;Qt6::Qml;gcLogging;gcMAVLink"
  IMPORTED_LOCATION_DEBUG "D:/work/ground_station/dev/jhatcgcs/bin/gcFactSystem.dll"
)

工程中的其他模块使用被export出来的库:

target_link_libraries(${target_name} PRIVATE gcFactSystem)

2. install 安装库

# 引入要用到的 CMake 模块
include(CMakePackageConfigHelpers)
include(GNUInstallDirs)

# 基本安装及 Targets 文件的生成
install(TARGETS ${PROJECT_NAME}
  EXPORT ${PROJECT_NAME}-targets
  RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
)

# Targets 文件的安装
install(EXPORT ${PROJECT_NAME}-targets
  FILE ${PROJECT_NAME}-targets.cmake
  NAMESPACE ${PROJECT_NAME}::
  DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
)

# Config 文件的导出(与安装?)
configure_package_config_file(
  ${PROJECT_SOURCE_DIR}/cmake/config.cmake.in
  ${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config.cmake
  INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
)

# ConfigVersion 文件的导出
write_basic_package_version_file(
  ${PROJECT_NAME}-config-version.cmake
  VERSION ${PACKAGE_VERSION}
  COMPATIBILITY AnyNewerVersion
)

# Config 和 ConfigVersion 文件的安装
install(FILES
  ${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config.cmake
  ${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake
  DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
)

# 头文件的安装
install(DIRECTORY ${PROJECT_SOURCE_DIR}/include/${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})

2.1. config.cmake 的生成及安装

生成config.cmake文件:

include(CMakePackageConfigHelpers)

configure_package_config_file(
  ${PROJECT_SOURCE_DIR}/cmake/config.cmake.in
  ${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config.cmake
  INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
)

安装config.cmake文件:

install(FILES
  ${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config.cmake
  ${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake
  DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
)

2.2. 头文件的安装

设置需要导出的头文件路径:

target_include_directories(${PROJECT_NAME} PUBLIC ${${PROJECT_NAME}_INCLUDES})

设置导出文件更好的方式,区分buildinstall,分别引用不同路径下的include目录:

target_include_directories(${PROJECT_NAME} PUBLIC
  $<BUILD_INTERFACE:${${PROJECT_NAME}_INCLUDES}> # 编译项目时引用项目下的头文件目录
  $<INSTALL_INTERFACE:include>  # 安装项目时引用 `<PREFIX>/include` ,比如 `/usr/include`
)

安装头文件:

install(DIRECTORY ${PROJECT_SOURCE_DIR}/include/${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})

3. 参考




    Enjoy Reading This Article?

    Here are some more articles you might like to read next:

  • al-folio 本地部署记录(Ubuntu 24.04)
  • C++ Traits
  • 道格拉斯-普克算法(Douglas–Peucker algorithm)
  • CMake支持库收集
  • QGC代码架构解析:飞行前检查(起飞条件)