一、基本语法与概念
1.文件的安装 install(FILES)
用Poco库 usr/local/poco/CMakeLists.txt中内容 举例如下:
2.目标安装 install(TARGETS)
3.导出目标与导出配置文件
将目标mylib导出名为MyModules的目标。MyModules导出目标包含了关于mylib的所有信息,包括头文件路径、库文件路径等内容
#生成导出目标MyModules
install(
TARGETS mylib
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
RUNTIME DESTINATION bin
EXPORT MyModules #指定导出目标
)
将该导出MyModules目标转换为对应的 *.cmake
文件,*.cmake
文件为导出配置文件,指定导出目标的安装策略。*.cmake文件导出到DESTINATION指定的路径下。
install(
EXPORT MyModules
FILE MyModules.cmake
DESTINATION lib/cmake/MyModules
)
4.安装
语句:sudo make install
运行 sudo make install 后在安装路径下自动生成了MyModules.cmake导出配置文件
5.XXXConfig.cmake文件
XXXConfig.cmake文件用于其他项目通过find_package命令找到和使用XXX这个库。XXXConfig.cmake可以只有一行代码,如下
include("${CMAKE_CURRENT_LIST_DIR}/MyModules.cmake")
configure_package_config_file自动生成XXXConfig.cmake文件、XXXConfig.cmake.in文件的编写、导出XXXConfig.cmake文件后续会补充进来。
二、示例代码
1.任务需求
2.项目目录
3.mylib的CMakeLists.txt文件
#导出静态库
add_library(mylib src/mylib.cpp)
#设置编译和运行路径
target_include_directories(
mylib PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
#生成导出目标MyModules
install(
TARGETS mylib
EXPORT MyModules #指定导出目标
ARCHIVE DESTINATION lib
)
#导出目标是虚拟概念,要把导出目标转化为导出配置文件
#生成导出配置文件.cmake
4.mylib2的CMakeLists.txt文件
#导出静态库
add_library(mylib2 src/mylib2.cpp)
#设置编译和运行路径
target_include_directories(
mylib2 PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
install(
TARGETS mylib2
EXPORT MyModules #指定导出目标
DESTINATION lib
)
5.INSTALLDEMO项目的CMakeLists.txt文件
cmake_minimum_required(VERSION 3.30)
project(InstallDemo)
add_subdirectory(mylib)
add_subdirectory(mylib2)
#把导出目标生成导出配置文件并且安装到指定路径
#导出配置文件是由导出目标自动生成的
install(
EXPORT MyModules
FILE MyModules.cmake
DESTINATION lib/cmake/MyModules
)