变量
- CMAKE_INSTALL_PREFIX
用于指定cmake install时的相对地址前缀。
(1)编译指定: cmake -DCMAKE_INSTALL_PREFIX=/usr/bin
(2)文件指定: set(CMAKE_INSTALL_PREFIX /usr/bin)
install命令
目标文件
- 使用方法
install(TARGETS targets... [EXPORT <export-name>]
[[ARCHIVE|LIBRARY|RUNTIME|OBJECTS|FRAMEWORK|BUNDLE|
PRIVATE_HEADER|PUBLIC_HEADER|RESOURCE]
[DESTINATION <dir>]
[PERMISSIONS permissions...]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT <component>]
[NAMELINK_COMPONENT <component>]
[OPTIONAL] [EXCLUDE_FROM_ALL]
[NAMELINK_ONLY|NAMELINK_SKIP]
] [...]
[INCLUDES DESTINATION [<dir> ...]]
)
1. 目标文件类型
静态库: ARCHIVE
动态库: LIBRARY
可执行二进制文件: RUNTIME
与库关联的PUBLIC头文件: PUBLIC_HEADER
与库关联的PRIVATE头文件: PRIVATE_HEADER
2. 参数含义
DESTINATION:指定磁盘上要安装文件的目录;
PERMISSIONS:指定安装文件的权限;
有效权限: OWNER_READ,OWNER_WRITE,OWNER_EXECUTE,
GROUP_READ,GROUP_WRITE,GROUP_EXECUTE,
WORLD_READ,WORLD_WRITE,WORLD_EXECUTE,
SETUID和SETGID;
CONFIGURATIONS:指定安装规则适用的构建配置列表(DEBUG或RELEASE等);
COMPONENT:指定了该安装规则相关的一个安装部件的名字,如“runtime”;
EXCLUDE_FROM_ALL:指定该文件从完整安装中排除,仅作为特定于组件的安装的一部分进行安装;
OPTIONAL:如果要安装的文件不存在,则指定不是错误。
3. 使用案例:
install(TARGETS bin_test
RUNTIME DESTINATION ${PROJECT_SOURCE_DIR}/install/usr/bin)
install(TARGETS lib_test
LIBRARY DESTINATION ${PROJECT_SOURCE_DIR}/install/usr/lib)
普通文件
- 使用方法
install(<FILES|PROGRAMS> files...
TYPE <type> | DESTINATION <dir>
[PERMISSIONS permissions...]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT <component>]
[RENAME <name>] [OPTIONAL] [EXCLUDE_FROM_ALL])
1. 参数含义
FILES:为普通的文本文件
PROGRAMS:指的是非目标文件的可执行程序(如脚本文件)
TYPE:输入TYPE 不需要填写DESTINATION,使用默认的路径
RENAME:指定已安装文件的名称。仅当命令安装了单个文件时,才允许重命名。
其他参数同上
2. 使用案例
install(FILES ${PROJECT_SOURCE_DIR}/libtest.so
DESTINATION ${PROJECT_SOURCE_DIR}/install/usr/bin_test
PERMISSIONS OWNER_READ GROUP_READ WORLD_READ)
目录
- 使用方法
install(DIRECTORY dirs...
TYPE <type> | DESTINATION <dir>
[FILE_PERMISSIONS permissions...]
[DIRECTORY_PERMISSIONS permissions...]
[USE_SOURCE_PERMISSIONS] [OPTIONAL] [MESSAGE_NEVER]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT <component>] [EXCLUDE_FROM_ALL]
[FILES_MATCHING]
[[PATTERN <pattern> | REGEX <regex>]
[EXCLUDE] [PERMISSIONS permissions...]] [...])
1. 参数含义
dirs:目录名不以/结尾,包含目录本身,目录名以 / 结尾,目录下的内容,不包括目录本身。
PATTERN或REGEX:以精细的粒度控制目录的安装,可以指定一个通配模式或正则表达式对输入目录过滤;
PATTERN仅匹配完整的文件名
REGEX将匹配文件名的任何部分,但它可以使用 / 和 $ 模拟PATTERN行为。
PATTERN或REGEX表达式后的参数,仅应用于满足表达式的文件或目录
EXCLUDE选项:跳过匹配的文件或目录
PERMISSIONS选项:覆盖匹配文件或目录的权限设置。
2. 使用案例
install(DIRECTORY test1 test2/ DESTINATION share/test
FILES_MATCHING PATTERN "*.h"
PATTERN "CVS" EXCLUDE
PATTERN "test2/*"
PERMISSIONS OWNER_WRITE)
将test1目录安装到share/test,将scripts/中的内容安装到share/test
从目录中得到头文件
两个目录均不包含目录名为CVS的子目录
对于scripts/*的文件指定权限OWNER_WRITE
脚本的运行
- 使用方法
install([[SCRIPT <file>] [CODE <code>]]
[COMPONENT <component>] [EXCLUDE_FROM_ALL] [...])
1. SCRIPT参数:在安装过程中调用给定的CMake脚本文件(即.cmake脚本文件)
如果脚本文件名是相对路径,则将相对于当前源目录进行解释;
CODE参数:在安装过程中调用给定的CMake代码;
将代码指定为双引号字符串内的单个参数;
2. 使用案例
install(CODE "MESSAGE(\"Sample install message.\")")
这条命令将会在install的过程中执行cmake代码,打印语句。
export
功能: 导出目标供外部使用
- 使用方法
install(EXPORT <export-name> DESTINATION <dir>
[NAMESPACE <namespace>] [FILE <name>.cmake]
[PERMISSIONS permissions...]
[CONFIGURATIONS [Debug|Release|...]]
[EXPORT_LINK_INTERFACE_LIBRARIES]
[COMPONENT <component>])
- 使用案例
install(TARGETS myexe EXPORT myproj DESTINATION bin)
install(EXPORT myproj NAMESPACE mp_ DESTINATION lib/myproj)
目录结构:
my_library
-- cmake
-- MyLibraryConfig.cmake
-- include
-- my_library
-- my_library.h
-- src
-- my_library.cpp
-- CMakeLists.txt
编译:
project(MyLibrary VERSION 1.0.0 LANGUAGES CXX)
find_package(OpenCV REQUIRED)
add_library(MyLibrary)
target_compile_features(MyLibrary PRIVATE cxx_std_11)
target_sources(MyLibrary PRIVATE src/my_library.cpp)
target_include_directories(MyLibrary
PUBLIC
$<INSTALL_INTERFACE:include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
PRIVATE
${OpenCV_INCLUDE_DIRS}
)
target_link_libraries(MyLibrary PRIVATE ${OpenCV_LIBRARIES})
// 拷贝库到系统目录下
include(GNUInstallDirs)
install(TARGETS MyLibrary EXPORT MyLibraryTargets
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} )
// 拷贝MyLibraryTargets.cmake自动生成目标文件到cmake系统目录
install(EXPORT MyLibraryTargets FILE MyLibraryTargets.cmake
NAMESPACE MyLibrary::
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/MyLibrary)
// 拷贝头文件
install(DIRECTORY include/
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
// 拷贝MyLibraryConfig.cmake文件到cmake系统目录,用途是让使用者通过find_packge找到这个库
install(FILES ${CMAKE_CURRENT_LIST_DIR}/cmake/MyLibraryConfig.cmake
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/MyLibrary)
MyLibraryConfig.cmake 文件
get_filename_component(MyLibrary_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" DIRECTORY)
// 找到依赖库
include(CMakeFindDependencyMacro)
find_dependency(OpenCV REQUIRED)
// 导入MyLibraryTargets.cmake,文件保存了声明的各种依赖的名称和路径。
if(NOT TARGET MyLibrary::MyLibrary)
include("${MyLibrary_CMAKE_DIR}/MyLibraryTargets.cmake")
endif()
注: 执行程序可通过 find_package(MyLibrary REQUIRED) 找到并链接库