CMake INSTALL

2023-11-12

原文: http://blog.csdn.net/yangfeng2014/article/details/50638601 

 

本帖子适用于初学者,StepByStep的入门CMake,CMake也是一门编程语言,只不过是针对编译和链接这种程序构建的过程的语言,学习基本语法就可以初步入门,后面需要什么复杂的功能,进阶掌握需要自己去查找官方文档,后续会给出查阅的一些方式

 

INSTALL指令

安装的需要有两种,一种是从代码编译后直接make install安装,一种是打包时的指定目录安装。 
这里需要引入一个新的cmake 指令 INSTALL和一个非常有用的变量CMAKE_INSTALL_PREFIX。 
CMAKE_INSTALL_PREFIX变量类似于configure脚本的 –prefix,常见的使用方法看 
起来是这个样子: 
cmake -DCMAKE_INSTALL_PREFIX=/usr .

INSTALL指令用于定义安装规则,安装的内容可以包括目标二进制、动态库、静态库以及 
文件、目录、脚本等。

INSTALL指令包含了各种安装类型,我们需要一个个分开解释:

目标文件的安装

INSTALL(TARGETS targets...
        [[ARCHIVE|LIBRARY|RUNTIME]
                   [DESTINATION <dir>]
                   [PERMISSIONS permissions...]
                   [CONFIGURATIONS
        [Debug|Release|...]]
                   [COMPONENT <component>]
                   [OPTIONAL]
                ] [...])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

参数中的TARGETS后面跟的就是我们通过ADD_EXECUTABLE或者ADD_LIBRARY定义的 
目标文件,可能是可执行二进制、动态库、静态库。

目标类型也就相对应的有三种,ARCHIVE特指静态库,LIBRARY特指动态库,RUNTIME 
特指可执行目标二进制。

DESTINATION定义了安装的路径,如果路径以/开头,那么指的是绝对路径,这时候 
CMAKE_INSTALL_PREFIX其实就无效了。如果你希望使用CMAKE_INSTALL_PREFIX来 
定义安装路径,就要写成相对路径,即不要以/开头,那么安装后的路径就是 
${CMAKE_INSTALL_PREFIX}/<DESTINATION定义的路径>

举个简单的例子:

INSTALL(TARGETS myrun mylib mystaticlib
       RUNTIME DESTINATION bin
       LIBRARY DESTINATION lib
       ARCHIVE DESTINATION libstatic
)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

上面的例子会将: 
可执行二进制myrun安装到${CMAKE_INSTALL_PREFIX}/bin目录 
动态库libmylib安装到${CMAKE_INSTALL_PREFIX}/lib目录 
静态库libmystaticlib安装到${CMAKE_INSTALL_PREFIX}/libstatic目录 
特别注意的是你不需要关心TARGETS具体生成的路径,只需要写上TARGETS名称就可以 
了。

普通文件的安装

INSTALL(FILES files... DESTINATION <dir>
         [PERMISSIONS permissions...]
         [CONFIGURATIONS [Debug|Release|...]]
         [COMPONENT <component>]
         [RENAME <name>] [OPTIONAL])
可用于安装一般文件,并可以指定访问权限,文件名是此指令所在路径下的相对路径。
如果默认不定义权限PERMISSIONS,安装后的权限为,OWNER_WRITE,OWNER_READ,
GROUP_READ,和WORLD_READ,即644权限。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

非目标文件的可执行程序安装(比如脚本之类)

INSTALL(PROGRAMS files... DESTINATION <dir>
     [PERMISSIONS permissions...]
     [CONFIGURATIONS [Debug|Release|...]]
     [COMPONENT <component>]
     [RENAME <name>] [OPTIONAL])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

跟上面的FILES指令使用方法一样,唯一的不同是安装后权限为: 
OWNER_EXECUTE, GROUP_EXECUTE, 和WORLD_EXECUTE,即755权限

目录的安装

INSTALL(DIRECTORY dirs... DESTINATION <dir>
     [FILE_PERMISSIONS permissions...]
     [DIRECTORY_PERMISSIONS permissions...]
     [USE_SOURCE_PERMISSIONS]
     [CONFIGURATIONS [Debug|Release|...]]
     [COMPONENT <component>]
     [[PATTERN <pattern> | REGEX <regex>]
      [EXCLUDE] [PERMISSIONS permissions...]] [...])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

这里主要介绍其中的DIRECTORY、PATTERN以及PERMISSIONS参数。 
DIRECTORY后面连接的是所在Source目录的相对路径,但务必注意: 
abc和abc/有很大的区别。 
abc意味着abc这个目录会安装在目标路径下; 
abc/意味着abc这个目录的内容会被安装在目标路径下; 
如果目录名不以/结尾,那么这个目录将被安装为目标路径下的abc,如果目录名以/结尾, 
代表将这个目录中的内容安装到目标路径,但不包括这个目录本身。 
PATTERN用于使用正则表达式进行过滤, 
PERMISSIONS用于指定PATTERN过滤后的文件权限。

我们来看一个例子:

INSTALL(DIRECTORY icons scripts/ DESTINATION share/myproj
        PATTERN "CVS" EXCLUDE
        PATTERN "scripts/*"
        PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ
        GROUP_EXECUTE GROUP_READ)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

这条指令的执行结果是: 
将icons目录安装到 <prefix>/share/myproj,将scripts/中的内容安装到 
<prefix>/share/myproj 
不包含目录名为CVS的目录,对于scripts/*文件指定权限为 OWNER_EXECUTE 
OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ.

安装时cmake脚本的执行

INSTALL([[SCRIPT <file>] [CODE <code>]] [...])
SCRIPT参数用于在安装时调用cmake脚本文件(也就是<abc>.cmake文件)
CODE参数用于执行CMAKE指令,必须以双引号括起来。比如:
INSTALL(CODE "MESSAGE(\"Sample install message.\")")

转载于:https://my.oschina.net/u/4000302/blog/3029461

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

CMake INSTALL 的相关文章

随机推荐

  • pycharm错误ERROR: Command errored out with exit status 1:

    报错 ERROR Command errored out with exit status 1 错误原因 python版本与pycharm要求的版本不一致 解决方法 1 在pycharm中找到File 打开Settings 2 在Setti
  • FMQL在linux下GPIO的映射关系与使用

    最近几年国产化芯片的使用如火如荼 部分国产手册说明杂且描述不清 尤其是一些映射关系使用文字描述非常不直观 博主在使用GPIO功能输出的时候反复看了几遍再去尝试控制耗费了不少时间 现结合相关文档总结GPIO映射表格 方便读者使用 1 GPIO
  • 性能测试——结果量含义(系统吞吐量(TPS)、用户并发量)

    性能测试 首先 开发软件的目的是为了让用户使用 我们先站在用户的角度分析一下 用户需要关注哪些性能 对于用户来说 当点击一个按钮 链接或发出一条指令开始 到系统把结果已用户感知的形式展现出来为止 这个过程所消耗的时间是用户对这个软件性能的直
  • Run-Time Check Failure #2 – Stack around the variable 'a' was corrupted.

    Run Time Check Failure 2 Stack around the variable a was corrupted 今天在用VS调代码的时候 会出现这个问题 经过查找以及DEBUG 最终发现是由于建立的数组下标溢出造成的
  • 在linux上开关swap

    swapon a 会开启 etc fstab上定义的所有swap swapoff a会关闭所有swap cat proc meminfo会显示swap的情况 另外下面的命令也会显示swap swapon s Filename Type Si
  • 什么是域名,怎么买服务器

    1 域名 域名 是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称 用于在数据传 输时标识计算机的电子方位 www baidu com com是顶级域名 baidu是一级域名 www是二级域名 每个域名可以对应一个i
  • tars协议序列化分析

    引言 tars序列化过程 TARS编码协议是一种数据编解码规则 它将整形 枚举值 字符串 序列 字典 自定义结构体等数据类型按照一定的规则编码到二进制数据流中 对端接收到二进制数据流之后 按照相应的规则反序列化可得到原始数值 简单理解 TA
  • os.walk详解

    https www jianshu com p bbad16822eab python中os walk是一个简单易用的文件 目录遍历器 可以帮助我们高效的处理文件 目录方面的事情 1 载入 要使用os walk 首先要载入该函数 可以使用以
  • 关于MP3文件中找不到TAG标签的问题

    今天做项目需要上传mp3文件 在postman中测试的时候发现找不到这个mp3文件中的TAG标签 心想着不应该啊 我这是正规音频啊 如果是图片把后缀改成mp3没有TAG是肯定的 但是我这个音频为什么也没有呢 经过百度一番 初步判断有可能问题
  • xcode常用快捷键 快捷生成代码分享

    快速打印 NSLog lt text gt 快速string NSString 快速for循环 for int i 0 i lt lt max gt i lt code gt 快速setter和getter property lt type
  • STM32F103 - 配置规则通道参数 - 05 - unfinished -unfinished-unfinished

    五 配置规则通道参数 设置指定ADC的规则组通道 一个序列 采样时间 常规通道配置 ADC RegularChannelConfig ADC1 ch 1 ADC SampleTime 239Cycles5 ADC1 ADC通道 采样时间为2
  • ubuntu安装教程及docker安装容器,前后端部署

    1 0 Linux的常用命令 删除目录中的文件 rm fate txt 删除一个目录及其内容 rm r dir r 选项作用递归删除目录及其子目录中的所有内容 dir是文件夹名称 创建一个文件 touch fate txt 创建的是一个空文
  • CentoS8 安装篇十一:ngrok内网穿透工具搭建

    一 准备工作 1 外网域名 域名备案 2 服务器 有固定ip 3 服务器开放端口 80 443 4443 端口下面使用 注意与其他端口有冲突 4 域名映射 下面使用到ngrok xxx com必须映射至该服务器 5 添加泛域名映射至该服务器
  • R

    文章目录 Windows下更新R版本及Rstudio 一 更新R版本 二 Rstudio中更新R Windows下更新R版本及Rstudio 在R中安装一些包时 经常会出现包与旧版本R不兼容的问题 所以就对Windows下R的版本进行了更新
  • python数据精度问题

    优质资源分享 学习路线指引 点击解锁 知识定位 人群定位 Python实战微信订餐小程序 进阶级 本课程是python flask 微信小程序的完美结合 从项目搭建到腾讯云部署上线 打造一个全栈订餐系统 Python量化交易实战 入门级 手
  • go实现bcrypt加密

    什么是bcrypt Bcrypt 是一款加密工具 它生成的密文是60位的 而且每次加密生成的值是不一样的 MD5 加密虽然不可逆 但是它每次生成的密文是相同的 这便给暴力破解留下了余地 所以推荐使用bcrypt进行加密 简单实现 packa
  • Linux 后台运行的进程printf输出到什么地方,是否消耗内存

    分析 正常情况下printf 输出到 stdout 输出流 可以通过 freopen 改变 stdout 转向到du文件 例如 freopen test txt w stdout printf abcd 98765 会把 abcd 9876
  • 【专题5:硬件设计】 之 【48.推挽电路驱动MOS管】

    嵌入式工程师成长之路 系列文章 总目录 系列文章总目录 希望本是无所谓有 无所谓无的 这正如脚下的路 其实地上本没有路 走的人多了 也便成了路 原创不易 文章会持续更新 欢迎微信扫码关注公众号 承接 小程序 嵌入式 PC端项目开发 联系作者
  • 数据库设计——表的关系与范式

    一 表的关系 1 一对一关系 1 1 概念描述 例如 一个人只能拥有一张身份证 一张身份证也只能对应一个人 那么这里的一个人和身份证就是一对一的关系 多表之间一对一关系如何实现 两个一对一关系的表 可以在任意一方添加外键 并将外键指向另一方
  • CMake INSTALL

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 原文 http blog csdn net yangfeng2014 article details 50638601 本帖子适用于初学者 StepByStep的入门CMa