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

本文详细介绍了CMake中各类文件的安装配置方法,包括可执行文件、库文件、普通文件和目录的安装过程。同时解释了CMAKE_INSTALL_PREFIX变量的作用及其默认行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

举个简单的例子:


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

上面的例子会将:

可执行二进制myrun安装到CMAKEINSTALLPREFIX/binlibmylib{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 DESTINATION bin)

(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}/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值