news 2026/10/23 3:34:48

【cmake】CMake实践二:hello world(v2.0) 第二部分

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【cmake】CMake实践二:hello world(v2.0) 第二部分

举个简单的例子:

INSTALL(TARGETS myrun mylib mystaticlib RUNTIME DESTINATIONbinLIBRARY DESTINATION lib ARCHIVE DESTINATION libstatic)

上面的例子会将:

可执行二进制myrun安装到CMAKEINSTALLPREFIX/bin目录动态库libmylib安装到{CMAKE_INSTALL_PREFIX}/bin目录动态库libmylib安装到CMAKEI​NSTALLP​REFIX/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权限。

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

INSTALL(PROGRAMS files...DESTINATION<dir>[PERMISSIONS permissions...][CONFIGURATIONS[Debug|Release|...]][COMPONENT<component>][RENAME<name>][OPTIONAL])

跟上面的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...]][...])

这里主要介绍其中的DIRECTORY、PATTERN以及PERMISSIONS参数。
DIRECTORY后面连接的是所在Source目录的相对路径,但务必注意: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)

这条指令的执行结果是:

将icons目录安装到 /share/myproj,将scripts/中的内容安装到/share/myproj不包含目录名为CVS的目录,对于scripts/*文件指定权限为 OWNER_EXECUTE OWNER_WRITE OWNER_READ ROUP_EXECUTE GROUP_READ。

安装时CMAKE脚本的执行:

INSTALL([[SCRIPT<file>][CODE<code>]][...])

SCRIPT参数用于在安装时调用cmake脚本文件(也就是.cmake文件)

CODE参数用于执行CMAKE指令,必须以双引号括起来。比如:
INSTALL(CODE “MESSAGE(“Sample install message.”)”)
安装还有几个被标记为过时的指令,比如INSTALL_FILES等,这些指令已经不再推荐使用,所以,这里就不再赘述了。下面,我们就来改写我们的工程文件,让他来支持各种文件的安装,并且,我们要使用CMAKE_INSTALL_PREFIX指令。

5、修改Helloworld支持安装

首先我们先补上为添加的文件。

添加doc目录及文件:

cd/backup/cmake/t2 mkdir doc vi doc/hello.txt

随便填写一些内容并保存
在工程目录添加runhello.sh脚本,内容为:

hello

添加工程目录中的COPYRIGHT和README

touch COPYRIGHT touch README

下面改写各目录的CMakeLists.txt文件。

(1)、安装COPYRIGHT/README,直接修改主工程文件CMakelists.txt,加入以下指令:

INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake/t2)

(2)、安装runhello.sh,直接修改主工程文件CMakeLists.txt,加入如下指令:

INSTALL(PROGRAMS runhello.sh DESTINATIONbin)

(3)、安装doc中的hello.txt,这里有两种方式:

一是通过在doc目录建立 CMakeLists.txt并将doc目录通过ADD_SUBDIRECTORY加入工程来完成。

另一种方法是直接在工程目录通过 INSTALL(DIRECTORY来完成),前者比较简单,各位可以根据兴趣自己完成,我们来尝试后者,顺便演示以下DIRECTORY的安装。因为hello.txt要安装到//share/doc/cmake/t2,所以我们不能直接安装整个doc目录,这里采用的方式是安装doc目录中的内容,也就是使用”doc/”在工程文件中添加

INSTALL(DIRECTORY doc/DESTINATION share/doc/cmake/t2)

现在进入build目录进行外部编译,注意使用CMAKE_INSTALL_PREFIX参数,这里我们将它安装到了/tmp/t2目录:

cmake-DCMAKE_INSTALL_PREFIX=/tmp/t2/usr..

然后运行

make make install

让我们进入/tmp/t2目录看一下安装结果:

./usr./usr/share./usr/share/doc./usr/share/doc/cmake./usr/share/doc/cmake/t2./usr/share/doc/cmake/t2/hello.txt./usr/share/doc/cmake/t2/README./usr/share/doc/cmake/t2/COPYRIGHT./usr/bin./usr/bin/hello./usr/bin/runhello.sh

如果你要直接安装到系统,可以使用如下指令:

cmake-DCMAKE_INSTALL_PREFIX=/usr..

7、一个疑问
如果我没有定义CMAKE_INSTALL_PREFIX会安装到什么地方?你可以尝试以下,cmake …;make;make install,你会发现CMAKE_INSTALL_PREFIX的默认定义是/usr/local

8、小结
本小节主要描述了如何在工程中使用多目录、各种安装指令以及CMAKE_INSTALL_PREFIX变量(你真够牛的,这么点东西居然罗唆了这么多文字)在下一小节,我们将探讨如何在cmake中构建动态库和静态库,以及如何使用外部头文件和外部共享库,毕竟,这是程序编写中最长使用的(对了,你知道用怎样的gcc参数可以直接构建静态库和动态库吗?)
未完,待续。。。。ALL_PREFIX}/<DESTINATION定义的路径>

未完待续O(∩_∩)O

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/23 3:34:10

Ubuntu 20.04 配置IC617/Spectre18/Calibre19全套EDA工具链要点

简介&#xff1a;在Ubuntu 20.04中部署Cadence IC617(HotFix)、Spectre18、Calibre19与XCELIUMMAIN_18常因依赖库、AVX2指令集和许可证问题受阻&#xff0c;这份安装笔记正是为解决这一难题而整理&#xff0c;适合集成电路设计工程师、研究生、运维人员以及具备一定Linux基础、…

作者头像 李华
网站建设 2026/10/23 3:33:24

Linux下启动Redis的完整实践指南与常见坑位排查

很多后端项目跑起来之后&#xff0c;第一件事不是写代码&#xff0c;而是把基础设施准备好。Redis 就是其中最常用的一环。标题写的是“Linux下启动redis”&#xff0c;看起来很基础&#xff0c;但实际运维过的人都知道&#xff0c;这个“启动”背后藏着不少门道&#xff1a;配…

作者头像 李华
网站建设 2026/10/23 3:32:58

Agent记忆架构实战:情景记忆与语义记忆如何协同构建Memory Stack

做Agent开发也有一段时间了&#xff0c;从最早的“提示词外部工具”的玩法&#xff0c;到后面开始碰记忆模块&#xff0c;中间踩了不少坑。最近在重构一个知识型Agent的底层架构&#xff0c;正好做到Episodic Semantic Memory Stack这一层&#xff0c;很多朋友问我这两类记忆到…

作者头像 李华
网站建设 2026/10/23 3:32:51

ISO 21448-2022 SOTIF 预期功能安全标准解读与工程落地实践

简介&#xff1a;ISO 21448-2022《道路车辆——预期功能的安全性》是国际标准化组织发布的SOTIF领域核心标准&#xff0c;面向汽车制造商、零部件供应商、软件开发商及道路安全监管机构&#xff0c;用于评估和缓解自动驾驶与辅助驾驶系统在正常运行条件下因功能局限、传感器失效…

作者头像 李华
网站建设 2026/10/23 3:32:39

Qlib量化投资实战:港股因子选股与LightGBM模型全流程

简介&#xff1a;这份PDF文档是华泰证券金工研究团队出品的深度研究报告《微软AI量化投资平台Qlib体验》&#xff0c;面向量化投资研究者、金融工程从业者及希望入门AI选股的学生群体。报告系统梳理了Qlib的基础与进阶功能&#xff0c;对比传统量化策略开发流程&#xff0c;提炼…

作者头像 李华
网站建设 2026/10/23 3:31:51

基于ONNX Runtime的PP-OCR模型部署实战:从导出到调优

1. 为什么最终选 ONNX Runtime 这条路线&#xff0c;而不是继续扛着 Paddle 全家桶做 OCR 部署的人&#xff0c;十有八九都经历过这种时刻&#xff1a;模型在 Paddle 里跑得飞起&#xff0c;一换到业务方的服务器上就各种闹脾气——环境装不上、依赖冲突、推理速度拉胯。我自己…

作者头像 李华