cmake(8):install命令详解

2023-05-16

1. 说明

之前的示例中有提到使用cmake的install命令来自动安装库和头文件,但是只是使用到了install命令很基础很少的部分,其实该命令作用十分丰富,本篇文档用于说明该命令的详细使用方法。

2. install命令详解

install()命令为项目生成安装规则,通过在源目录中调用install()命令指定的安装规则将在安装过程中按顺序执行。此命令有多种格式,分别对应不同的安装目标,如:二进制文件、动态库、静态库以及文件、目录、脚本等。基本命令格式如下:

install(TARGETS <target>... [...])
install({FILES | PROGRAMS} <file>... [...])
install(DIRECTORY <dir>... [...])
install(SCRIPT <file> [...])
install(CODE <code> [...])
install(EXPORT <export-name> [...])


2.1 通用参数说明

上述6种命令格式,有部分参数使用方式和意义相同,在这里统一说明,后续不再单独说明。

参数如下:
DESTINATION
用于指定安装路径,可以是绝对路径,也可以是相对路径。
如果使用的是相对路径,那么需要配合使用CMAKE_INSTALL_PREFIX变量来指定路径前缀,该变量可以在CMakeLists.txt文件中设置,也可以通过cmake命令指定。由于cpack不支持绝对路径,所以cmake官方建议使用相对路径.

PERMISSIONS
指定安装文件的权限,这些权限包括:OWNER_READ, OWNER_WRITE, OWNER_EXECUTE, GROUP_READ, GROUP_WRITE, GROUP_EXECUTE, WORLD_READ, WORLD_WRITE, WORLD_EXECUTE, SETUID, 和 SETGID

CONFIGURATIONS
指定安装规则适用的构建配置列表(DEBUG或RELEASE等).
注意:此参数需要在RUNTIME DESTINATION参数之前使用.

COMPONENT
指定与安装规则相关联的安装组件名称,如"runtime"或"development"。在对应组件的安装过程中,将仅执行与给定组件名称关联的安装规则。除非显示标记为EXCLUDE_FROM_ALL,否则将安装所有组件。如果未指定COMPONENT,则会创建默认组件“未Unspecified”。可以使用CMAKE_INSTALL_DEFAULT_COMPONENT_NAME变量来控制默认组件名称。

EXCLUDE_FROM_ALL
指定该文件从完整安装中排除,并且仅作为特定于组件的安装的一部分进行安装。

RENAME
重命名要安装的文件,此参数只在安装单个文件时有效。

OPTIONAL
声明此步骤是可选的,即如果要安装的文件不存在,不必报错,程序将继续向后执行。

2.2 安装目标文件

这里的目标文件包含很多中类型,比如动态库.so, 静态库.a,和执行二进制文件等。

用法

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> ...]]
        )

TARGETS
要安装的目标文件,它支持多种平台的多种文件格式,包括静/动态库,可执行文件等。
目标文件 内容 安装目录变量 默认安装文件夹

目标文件内容安装目录变量默认安装文件夹
ARCHIVE静态库${CMAKE_INSTALL_LIBDIR}lib
LIBRARY动态库${CMAKE_INSTALL_LIBDIR}lib
RUNTIME可执行二进制文件${CMAKE_INSTALL_BINDIR}bin
PUBLIC_HEADER与库关联的PUBLIC头文件${CMAKE_INSTALL_INCLUDEDIR}include
PRIVATE_HEADER与库关联的PRIVATE头文件${CMAKE_INSTALL_INCLUDEDIR}include

EXPORT
此参数用于将名为export-name的导出文件与TARGETS文件相关联,它必须出现在任何目标选项之前。

[ARCHIVE|LIBRARY|RUNTIME|OBJECTS|FRAMEWORK|BUNDLE|PRIVATE_HEADER|PUBLIC_HEADER|RESOURCE]
用于指定TARGETS的文件类型。

NAMELINK_COMPONENT
有些平台的共享库具有版本控制符号,如Linux下:

lib<name>.so -> lib<name>.so.1

NAMELINK_COMPONENT选项就用于管理这类链接符号,类似于COMPONENT选项,但是如果生成了共享库名称链接,它将更改共享库名称链接的安装组件。如果未指定,则默认为COMPONENT的值。此参数只在在LIBRARY模块中使用。

NAMELINK_ONLY
表示仅安装库的链接文件。

NAMELINK_SKIP
与NAMELINK_ONLY参数作用相反,表示跳过链接文件。

INCLUDES DESTINATION
此选项指定目录列表,当通过install(EXPORT)命令导出时,这些目录将添加到的INTERFACE_INCLUDE_DIRECTORIES目标属性中。如果指定了相对路径,则将其视为相对于$ <INSTALL_PREFIX>的相对路径。

示例

install(TARGETS myExe mySharedLib myStaticLib
        RUNTIME DESTINATION bin
        LIBRARY DESTINATION lib
        ARCHIVE DESTINATION lib/static)
install(TARGETS mySharedLib DESTINATION /some/full/path)

这个例子安装myExe, mySharedLib, myStaticLib三个文件,其中myExe安装在<perfix>/bin, myStaticLib安装在<perfix>/lib/static/some/full/path路径中,mySharedLib安装在<perfix>/lib路径中。其中<perfix>由CMAKE_INSTALL_PREFIX指定。

2.3 安装文件

这种方式用于说明为项目安装文件的规则。最常见的比如安装.so对应的头文件。

用法

install(<FILES|PROGRAMS> files...
        TYPE <type> | DESTINATION <dir>
        [PERMISSIONS permissions...]
        [CONFIGURATIONS [Debug|Release|...]]
        [COMPONENT <component>]
        [RENAME <name>] [OPTIONAL] [EXCLUDE_FROM_ALL])

FILE
要安装的文件,由当前目录下的相对路径指定。如果没有显式指定PERMISSIONS参数,默认情况下文件的权限为:OWNER_WRITE, OWNER_READ, GROUP_READ, 和WORLD_READ

PROGRAMS
与FILE类型的文件类似,但是多了OWNER_EXECUTE, GROUP_EXECUTE, 和WORLD_EXECUTE权限。注意,虽然多了EXECUTE权限,但是这与TARGETS类型的操作是不一样的,比如shell 脚本。

TYPE
指定安装文件的类型。TYPE和DESTINATION 必须至少有一个被指定。
cmake支持的TYPE类型如下:

TYPE类型安装目录变量默认安装文件夹
BIN${CMAKE_INSTALL_BINDIR}bin
SBIN${CMAKE_INSTALL_SBINDIR}sbin
LIB${CMAKE_INSTALL_LIBDIR}lib
INCLUDE${CMAKE_INSTALL_INCLUDEDIR}include
SYSCONF${CMAKE_INSTALL_SYSCONFDIR}etc
SHAREDSTATE${CMAKE_INSTALL_SHARESTATEDIR}com
LOCALSTATE${CMAKE_INSTALL_LOCALSTATEDIR}var
RUNSTATE${CMAKE_INSTALL_RUNSTATEDIR}<LOCALSTATE dir>/run
DATA${CMAKE_INSTALL_DATADIR}<DATAROOT dir>
INFO${CMAKE_INSTALL_INFODIR}<DATAROOT dir>/info
LOCALE${CMAKE_INSTALL_LOCALEDIR}<DATAROOT dir>/locale
MAN${CMAKE_INSTALL_MANDIR}<DATAROOT dir>/man
DOC${CMAKE_INSTALL_DOCDIR}<DATAROOT dir>/doc

示例

include(GNUInstallDirs)
install(FILES mylib.h
        DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/myproj
)


2.4 安装目录

这类格式用于将一个或多个目录安装到目标路径中。其中目录的层级结构将被完整地拷贝到目标中。

用法

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...]] [...])

FILE_PERMISSIONS
用于指定目录内文件的权限。

DIRECTORY_PERMISSIONS
用于指定目录权限。

USE_SOURCE_PERMISSIONS
拷贝的文件将与源文件的权限保持一致,但是优先使用FILE_PERMISSIONS参数。

MESSAGE_NEVER
不输出安装状态。

FILES_MATCHING
这个选项必须在PATTERN或者REGEX选项前给出,用以禁止安装不匹配的文件。即只安装符合匹配规则的文件。

PATTERN
模式匹配。

REGEX
正则表达式匹配。

示例

# 用以说明FILES_MATCHING 选项的用法
install(DIRECTORY src/ DESTINATION include/myproj
        FILES_MATCHING PATTERN "*.h")
        
install(DIRECTORY icons scripts/ DESTINATION share/myproj
PATTERN "CVS" EXCLUDE
PATTERN "scripts/*"
PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ
            GROUP_EXECUTE GROUP_READ)


2.5 安装脚本文件

不同于我们所熟知的shell、python脚本等,这里的脚本文件是指cmake在执行安装时调用的脚本。是符合cmake程序格式的规则文件。

用法

install([[SCRIPT <file>] [CODE <code>]]
        [COMPONENT <component>] [EXCLUDE_FROM_ALL] [...])

SCRIPT
cmake安装时要执行的脚本文件。默认以相对路径表示。

CODE
cmake安装时要执行的代码,其格式是字符串表示的单句命令。

示例

install(CODE "MESSAGE(\"Sample install message.\")")

在安装时打印信息"Sample install message."

2.6 安装Exports

这类命令格式用于将TARGETS所需的外部符号写入到一个CMake文件,并安装到项目中。

用法

install(EXPORT <export-name> DESTINATION <dir>
        [NAMESPACE <namespace>] [[FILE <name>.cmake]|
        [PERMISSIONS permissions...]
        [CONFIGURATIONS [Debug|Release|...]]
        [EXPORT_LINK_INTERFACE_LIBRARIES]
        [COMPONENT <component>]
        [EXCLUDE_FROM_ALL])
install(EXPORT_ANDROID_MK <export-name> DESTINATION <dir> [...])

NAMESPACE
命名空间,cmake将在目标文件前面加上。

FILE
默认情况下,导入的exports是.cmake文件,但是可以通过FILE选项来重命名。

EXPORT_ANDROID_MK
用于指定安卓ndk 编译系统。

示例

这个命令在外部项目需要到当前项目的符号时会非常有用,如:

install(TARGETS myexe EXPORT myproj DESTINATION bin)
install(EXPORT myproj NAMESPACE mp_ DESTINATION lib/myproj)
install(EXPORT_ANDROID_MK myproj DESTINATION share/ndk-modules)

将可执行文件myexe安装到<prefix>/bin中,并将其代码导入到文件<prefix>/lib/myproj/myproj.cmake<prefix>/share/ndk-modules/Android.mk。其他项目可以使用include命令来加载此文件来引用myexe可执行文件。

3. 原理

install()命令会在编译目录中生成一个cmake_install.cmake的文件,该文件由安装程序或者CPack在安装时调用。也可以使用cmake -P命令来手动调用。
在使用命令手动调用时,有几个参数可供选择:

COMPONENT
将此变量设置为只安装一个CPack组件,而不是安装所有组件。例如,如果只想安装开发组件,请运行

cmake -DCOMPONENT=Development -p cmake_install.cmake.

BUILD_TYPE
如果多种配置生成器,可以使用此参数来指定编译类型。

cmake -DBUILD_TYPE=Debug -P cmake_install.cmake.

DESTDIR
这是一个环境变量,用于在UNIX系统中改变安装目录的前缀。

4. 示例

参见:cmake(3):编译库和可执行文件

参考链接

install-CMake
https://blog.csdn.net/qq_38410730/article/details/102837401

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

cmake(8):install命令详解 的相关文章

  • VINS-Fusion安装

    1 安装Ceres Solver 官方教程 xff1a http ceres solver org installation html 参考教程 xff1a https blog csdn net qq 27251141 article d
  • APM-MAVROS连接

    1 运行mavros roslaunch mavros apm launch fcu url 61 34 dev ttyUSB0 921600 34 2 读取topic之前先运行以下命令 xff0c 修改飞控广播频率 rosservice
  • PX4 Avoidance(3DVFH*)

    Github地址 xff1a https github com PX4 PX4 Avoidance readme PX4用户指南 xff1a computer vision obstacle avoidance PX4 Avoidance下
  • FreeRTOS源码分析与应用开发04:消息队列

    目录 1 队列结构 2 创建队列 2 1 动态创建队列 2 1 1 xQueueCreate函数 2 1 2 xQueueGenericCreate函数 2 1 3 xQueueGenericReset函数 2 2 静态创建队列 2 2 1
  • APM-SITL Gazebo MAVROS 仿真

    1 配置APM SITL环境 1 下载安装Ardupilot 参考链接 xff1a 官方教程 注意 xff1a 文件install prereqs ubuntu sh路径在 ardupilot Tools environment insta
  • Ego-planner-swarm安装及报错解决

    项目地址 xff1a https github com ZJU FAST Lab ego planner swarmhttps github com ZJU FAST Lab ego planner swarm https github c
  • 单片机和嵌入式系统的区别

    单片机和嵌入式系统的区别 嵌入式和单片机并不是一对相对的概念 xff0c 嵌入式系统包括硬件和软件部分 xff0c 而单片机是单片微型计算机 Single Chip Microcomputer 的简称 xff0c 即微控制单元 Microc
  • 程序员的5个级别,你属于哪一个等级?

    码农和程序员虽说是调侃 xff0c 但是实质上还真的是不一样 还别说 xff0c 程序员还是有分等级的 比如有技术专家 xff0c 初级专员等 程序员的级别不同 xff0c 薪水也是有着天壤之别 免费领取Python学习资料可以加小编的微信
  • FutureTask的使用示例

    今天看书 xff0c 有关于 FutureTask 的介绍 xff0c 感觉还蛮有意思的 xff0c 可以用它来做一些比较花时间的事情 下面打个通俗的比方来说明一下它的用处 xff1a 比如 xff0c 早上一大早的去公交站台等公交 xff
  • 用脚本创建快捷方式

    64 echo off set shortCutPath 61 C Documents and Settings administrator 桌面 set shortCutName 61 报表 set StartPath 61 起始位置 s
  • activemq配置wss协议

    wss是加密协议 xff0c 必须配置https证书 span class token operator lt span sslContext span class token operator gt span span class tok
  • MATLAB 初学者 课堂笔记

    1 预定义变量 xff1a pi i j inf xff1a 无穷大 eps a xff1a a 与大于 a 的最小的浮点数之间的距离 xff0c 距离越小表示精度越高 默认a 61 1 2 矩阵运算 xff1a 左除 C 61 A B 6
  • 备赛笔记:Opencv学习:颜色识别

    OpenCV颜色识别一般要以下步骤 xff1a 1 颜色空间转换 xff0c 将BGR转换为HSV xff0c 用色调区分颜色 2 按照阈值滤出所识别的颜色 3 消除噪点 xff0c 平滑边界 3 提取连续域 xff0c 提取要识别的颜色
  • 树莓派buster安装ROS完整记录

    我敢说这一教程全网找不到相同的 我今天在安装ROS时查了各方教程 xff1a 官方Wiki xff0c Google xff0c CSDN都各查了不下10篇 xff0c 终于综合各教程内容花了大半天下好了 使用硬件及软件 xff1a 树莓派
  • Linux操作系统原理与应用06:系统调用

    目录 1 Linux中的各种接口 1 1 LSB标准 1 2 Linux API 1 2 1 概述 1 2 2 Linux内核系统调用接口 1 2 3 C标准库 1 3 Linux ABI 1 4 内核API 1 5 系统调用与各种接口的关
  • 将csdn博客转换成makedown形式的文件并保存

    span class token comment 作者 Rain span span class token keyword import span re span class token keyword import span parse
  • VIBE:3D人体姿态预测项目复现笔记

    VIBE是一个的3D人体姿态预测开源项目 xff0c 需要基于该项目作一些开发 xff0c 首先需要能够搭建和是的环境成功复现它 不过 xff0c 这个项目的复现的 xff0c 真的不是一星半点的艰难 1 系统选择 之前一直用的Window
  • geometry_msgs设计的几个消息类型,定义的数据类型详解

    Point 点 float64 x xff0c float64 y xff0c float64 z Point32 float32 x xff0c float32 y xff0c float32 z 一般使用Point xff0c 大规模点
  • 分享个好用的开源录屏工具 Captura

    百度 或 点击 Captura 8 0 Download 进入官网下载 安装后是 如果折起来是这样 xff1a 红色框框那个是折叠按钮 红色圆形按钮是 开始录制 结束录制 和其他的录制按钮样式 xff0c 都差不多 xff0c 自行探索吧
  • 使用 aptitude解决ubuntu下apt-get install g++依赖问题

    问题描述 xff1a ubuntu下运行C 43 43 程序 xff0c 给出了如下错误提示 程序 g 43 43 尚未安装 使用以下命令安装 xff1a sudo apt get install g 43 43 执行 得出如下错误 正在读

随机推荐

  • 学习笔记-Raspberry Pi Zero W-4:串口(UART)的配置和使用

    4 1 开启UART 据官方所言 xff08 https www raspberrypi org documentation configuration uart md xff09 xff1a 树莓派CPU内部有两个串口 xff0c 一个P
  • CAAnimation——基本动画,关键帧动画和贝塞尔路径

    概述 在做对于图层的动画效果时 xff0c 往往直接改变属性或者使用隐式动画是不能满足我们的需求的 xff0c 所以我们就用到了显式动画 xff0c CAAnimation 它可以管理重复动画 准确的控制时间和步调 xff0c 并且能设定图
  • IOS详解TableView——性能优化及手工绘制UITableViewCell

    提高表视图的性能 UITableView作为应用中最常用的视图 xff0c 它的性能优化问题几乎是经常提及 下面对在非网络访问情况下的表视图性能优化进行了主要的几点说明 xff1a 1 自定义类或XIB文件时 在系统提供的样式不能满足我们的
  • IOS详解TableView——实现九宫格效果

    根据需求九宫格的效果可以有很多种 九宫格效果应用比较广泛 xff0c 实现也多种多样 xff0c 比如选项抽屉效果 这里写了一个在UITableView上显示九宫格效果的Demo 思路 xff1a 在Cell上初始化自定义按钮 xff0c
  • IOS详解TableView——内置刷新,EGO,以及搜索显示控制器

    这几天因为住的地方的网出了一点问题 xff0c 除了能上Q xff0c 上微博以外其他的网页全都无法登陆 博客也就没有跟进 今天恢复了 xff0c 所以继续更新博客 也希望大家能继续评论或私自给我一些建议或者交流 今天找到了以前一个Tabl
  • Linux设备驱动基础01:Linux设备驱动概述

    目录 1 设备驱动的作用 2 有无操作系统时的设备驱动 2 1 无操作系统 2 1 1 硬件 驱动和应用程序的关系 2 1 2 单任务软件典型架构 2 2 有操作系统 2 2 1 硬件 驱动 操作系统和应用软件的关系 3 Linux设备分类
  • IOS回调机制——代理,通知中心以及Block

    Xcode5 0正式版 IOS7和Xcode5正式版在昨天正式可以下载 IOS7不多说了 xff0c 交互设计 xff0c 界面风格 xff0c 操作的简化程度都属于比较领先的水平 这里来说说Xcode5正式版 xff0c 和以前的Xcod
  • IOS飞机大战OC版

    前一阵子看到了很多版本的打飞机游戏 xff0c 有Java版的C 43 43 版本的还有C语言版的 这几天闲着的时候写了一个OC版的 xff0c 也正好是因为答应朋友写这个游戏来把飞机都换成他照片 没有用Cocos2d框架 xff0c 用的
  • Swift的可选链,类型转换和扩展

    可选链 Optional Chaining 可选链是一种请求或调用属性 xff0c 方法 xff0c 子脚本的过程 可选性体现于请求或调用的目标当前可能为nil 若不为nil则成功调用 xff0c 否则返回nil并将链失效 调用可选链的返回
  • iOS小米遥控器的手势监听及UI实现

    这篇文章通过实例实现了一个类似小米手势遥控器的功能页面 效果图如下所示 xff1a 触摸事件的响应通过对系统的触摸实践监听来进行 通过一个数组来对点的集合进行缓存和分析 void touchesBegan NSSet touches wit
  • 博客搬家至Github

    为了使用Markdown写作更方便一些 xff0c 以后将使用github pages来管理博客 地址 xff1a Rannie s Page 欢迎来访
  • C++使用http向服务器发送json数据

    span class token macro property span class token directive hash span span class token directive keyword include span spa
  • 如何使用Git将Github项目拉到本地

    如何使用Git将Github项目拉到本地 前言 因为国内访问GIthub速度比较慢 xff0c 复制粘贴代码又慢效率也低 xff0c 所以建议下载Git工具 xff0c 直接把Github的项目整个下载到本地的文件夹 安装配置git 步骤如
  • 笔记本 - 数据分析百宝箱

    Numpy 一 基本操作 xff1a 属性 xff1a improt numpy as np 生成数组 xff1a array 61 np array 1 2 3 2 3 4 xff0c dtype 61 np int float arra
  • Faiss(5):IndexIVFPQ原理

    说明 原本想尝试自己从头写 xff0c 但看了下网上的各位前辈的博客后 xff0c 感觉自己还是才疏学浅 xff0c 没有理解透彻 xff0c 所以在这里做个搬运工 xff0c 偶尔加些个人的理解在里面 原文链接 xff1a https b
  • cmake(3):编译库和链接可执行文件

    1 说明 在实际开发的过程当中 xff0c 我们会经常需要将部分程序编译成静态或动态库的形式 xff0c 供其他应用程序调用而不是将所有文件一次编译为一个可执行文件 这篇笔记就记录使用cmake编译动态和静态库以及将库链接到可执行文件中的过
  • RTOS原理与实现02:基本任务切换实现

    目录 1 任务定义与切换原理 1 1 任务是什么 1 1 1 任务的外观 1 1 2 任务的内在 1 2 任务切换原理 1 2 1 任务切换的本质 1 2 2 要保存哪些任务运行状态 1 2 3 任务运行状态保存方案 1 3 设计实现 1
  • cmake(5):选择编译器及设置编译器选项

    1 说明 在实际的项目平台中可能安装有多个版本的编译器 xff0c 同时由于不同的功能可能会需要设置不同的编译参数 xff0c 这篇笔记就记录如何选择指定的编译器和配置参数 2 选择编译器 2 1 初始状态 我使用的开发平台默认安装的gcc
  • Faiss(14):IndexIVFPQ的CPU search过程分析

    1 说明 之前分析过了faiss 在GPU中的search过程 xff0c 这里分析一下IndexIVFPQ在CPU中的search过程 xff0c 即不将index拷贝到GPU中 2 过程分析 2 1 python接口 CPU searc
  • cmake(8):install命令详解

    1 说明 之前的示例中有提到使用cmake的install命令来自动安装库和头文件 xff0c 但是只是使用到了install命令很基础很少的部分 xff0c 其实该命令作用十分丰富 xff0c 本篇文档用于说明该命令的详细使用方法 2 i