构建生成工具cmake的使用(2)

发布于:2024-08-09 ⋅ 阅读:(141) ⋅ 点赞:(0)

一.制作库文件

Linux下动态库是以 .lib开头,以 .so为结尾。静态库以 .lib 开头,.a为结尾。                                  Windows下动态库以dll为结尾,以 .lib为结尾

1.1.cmake编写生成动态库

我们想把add.cc和sub.cc打成一个动态库 

执行cmake  ./和make指令

linux下掐头去尾就是真正的库的名称。和编写cmake时候project(xxx)中是一样的。

1.2.cmake编写生成静态库

现在我们试验一下cmake编写生成静态库

 

1.3.指定生成库的路径

动静态库就是源文件的二进制版本,怎么指定动静态库生成后存放在哪里呢?                              有一个宏是 LIBRARY_OUTPUT_PATH,这个宏保存了生成的库存放在哪里,用set给这个宏赋值,若不指定默认在cmake跟的路径下,若指定的路径不存在会递归生成。

  

二.cmake执行期间输出日志

 如果想在cmake执行期间输出某些内容或者日志,可以借助message

message(STATUS|WARNING|AUTHOR_WARNING|SEND_ERROR|FATAL_ERROR  xxxx)
STATUS: 普通消息。
WARNING:显示警告消息。
AUTHOR_WARNING:显示警告消息。
SEND_ERROR:显示错误消息
FATAL_ERROR:显示严重错误消息并停止配置过程
如果默认不指定等级,就代表很重要

我们在编写cmake文件时加上这些日志内容。 

 

 我们来验证一下假如日志等级为 FATAL_ERROR会不会中断构建。

 

 

可以发现确实停止了构建。 

三.字符串的操作

有时候编译一个程序所需要的源文件不在一个目录下,如果通过file命令对各个目录下源文件进行搜索,可能最后还要做一个拼接/移除操作。                                                                                    举个例子:比如在编写一个动态库的时候,用file查找目录下的所有.cc文件,查找后如果里面有一个main,cc是我们制作这个动态库所不需要的,就要对他进行移除,这种情况就需要用到字符串操作函数。

3.1.字符串的拼接

字符串的拼接可以使用 set 和 list                                                                                              

set(变量名  变量列表)
因为cmake下一切皆字符串。将变量列表下的所有值拼接在一起并将结果存储在第一个变量中,如果第一个变量中有值会直接覆盖。

list(APPEND  变量名 变量列表)
list和set其实大差不差,list第一个参数填写APPEND代表我要做拼接操作。这是因为list还有很多其他用途,并不是只像set一样只能进行拼操作,list的其他操作下面会讲到。

将和 CMakeLists.txt 同目录下的所有源文件的绝对路径存储在str1中,定义两个变量:str2和str3,再分别使用set和list拼接字符串。再使用message在构建时打印出来。

这里要特殊说明一下,用 set 和 list 拼接的字符串,在存储时会用分号(;)作为每个变量的分隔符。但是打印时候是不会显示出分号(;)的,这是因为方便list的其他操作的进行。下面举个例子说明一下:

比如用list拼接了几个字符串
list(APPEND str hello world Linux Windows)
实际在存储时str是这样存储的, hello;world;Linux;Winodws(set同理)
这样做是为了方便进行其他字符串操作,比如要在str查找有没有 helloworld 这个变量,其实是没有的,因为只有hello和world,并没有连在一起的。

3.2.list的其他字符串操作

list除了可以拼接字符串外,还可以移除, 获取长度, 搜索等。这里介绍几个最常用的list的功能。

3.2.1.list获取变量的长度

list(LENGTH 变量 存储变量列表长度的变量)
LENGTH是list用来获取长度的子命令,获取的长度是指变量中有几个变量,不是字符串长度总和。

 3.2.2.读取列表中的指定索引元素

list(GET 变量名称 索引编号 存储对应索引的变量)
GET是list用来获取对应下标元素的子命令。索引编号可以有多个,索引编号可以是从0开始,也可以是从-1开始。出了索引长度就会报错。
   
   abc  bcd  cde  efg
    0    1    2    3
   -4   -3   -2   -1
   

 

3.2.3.变量中的元素用连接符连接组成字符串

list(JOIN 变量 连接符 存储返回的字符串)
JOIN是list的连接子命令,比如连接符为xxx,变量为 abc bcd cde
则存储连接后的字符串为 abcxxxbcdxxxcde

3.2.4.查找变量中是否存在指定元素

list(FIND 变量 要查找的元素 存储结果)
如果找到了就返回下标,没有找到就返回-1

3.2.5.在指定下标插入若干元素 

list(INSERT 变量 下标 插入的若干元素)

 

3.2.6.删除指定变量中的元素

list(REMOVE_ITEM 变量 要删除的元素)

 

3.2.7.删除指定下标元素

list(REMOVE_AT 变量 下标)

 


网站公告

今日签到

点亮在社区的每一天
去签到