CMakeLists.txt语法规则:部分常用命令说明三

一. 简介

前面几篇文章学习了CMakeLists.txt语法中 add_executable命令,add_library命令,aux_source_directory命令,include_directories命令,**add_subdirectory 命令的简单使用。**文章如下:

CMakeLists.txt语法规则:部分常用命令说明一-CSDN博客

CMakeLists.txt语法规则:部分常用命令说明二-CSDN博客

本文继续学习 CMakeLists.txt语法中部分常用命令。

二. CMakeLists.txt语法规则:部分常用命令

link_directories 命令用于设置库文件的搜索路径,相当于 gcc 编译器的 -L 选项;
link_libraries 命令用于设置需要链接的库文件,相当于 gcc 编译器的 -l 选项;命令定义如下所示:

复制代码
link_directories(directory1 directory2 ...)
link_libraries([item1 [item2 [...]]]
 [[debug|optimized|general] <item>] ...)

link_directories 会将指定目录添加到 库文件搜索列表 (可以认为每一个 CMakeLists.txt 源码都有自己的库文件搜索列表 中;
同理, link_libraries 命令会将指定库文件添加到链接库列表。 link_directories 命令可 以使用绝对路径或相对路径指定目录,相对路径被解释为当前源码路径的相对路径。
譬如工程目录结构如下所示:

复制代码
├── build
├── CMakeLists.txt
├── include
│ └── hello.h
├── lib
│ └── libhello.so
└── main.c

在 lib 目录下有一个动态库文件 libhello.so ,编译链接 main.c 源文件时需要链接 libhello.so ; CMakeLists.txt 文件内容如下所示:

复制代码
# 顶层 CMakeLists.txt
cmake_minimum_required("VERSION" "3.5")
project("HELLO")

include_directories(include)
link_directories(lib)
link_libraries(hello)
add_executable(main main.c)

库文件名既可以使用简写,也可以库文件名的全称,譬如:

复制代码
link_libraries(hello)  # 简写

link_libraries(libhello.so)  # 全称

link_libraries 命令也可以指定库文件的全路径(绝对路径 /开头),如果不是/开头,link_libraries **会认为调用者传入的是库文件名,而非库文件全路径,**譬如上述 CMakeLists.txt 可以修改为下面这种方式:

复制代码
# 顶层 CMakeLists.txt
cmake_minimum_required("VERSION" "3.5")
project("HELLO")

include_directories(include)
link_libraries(${PROJECT_SOURCE_DIR}/lib/libhello.so)
add_executable(main main.c)

与 include_directories 命令相同,当调用 add_subdirectory 命令加载子源码时,会将link_directories 命令 包含的目录列表以及 link_libraries 命令包含的链接库列表,向下传递给子源码。

2. list

list 命令是一个关于列表操作的命令,譬如获取列表的长度、从列表中返回由索引值指定的元素、将元素追加到列表中等等。命令定义如下:

复制代码
list(LENGTH <list> <output variable>)
list(GET <list> <element index> [<element index> ...]
 <output variable>)
list(APPEND <list> [<element> ...])
list(FIND <list> <value> <output variable>)
list(INSERT <list> <element_index> <element> [<element> ...])
list(REMOVE_ITEM <list> <value> [<value> ...])
list(REMOVE_AT <list> <index> [<index> ...])
list(REMOVE_DUPLICATES <list>)
list(REVERSE <list>)
list(SORT <list>)

列表这个概念还没给大家介绍,列表其实就是字符串数组(或者叫字符串列表、字符串数组),稍后再向大家说明。
LENGTH 选项用于返回列表长度;

GET 选项从列表中返回由索引值指定的元素;

APPEND 选项将元素追加到列表后面;
FIND 选项将返回列表中指定元素的索引值,如果未找到,则返回 -1 。
INSERT 选项将向列表中的指定位置插入元素。
REMOVE_AT 和 REMOVE_ITEM 选项将从列表中删除元素,不同之处在于 REMOVE_ITEM 将删除给定的元素,而 REMOVE_AT 将删除给定索引值的元素。
REMOVE_DUPLICATES 选项将删除列表中的重复元素。
REVERSE 选项就地反转列表的内容。
SORT 选项按字母顺序对列表进行排序。

下一篇文章继续学习其他的 CMakeLists.txt语法的部分常用命令。

相关推荐
QT 小鲜肉1 分钟前
【Linux命令大全】001.文件管理之file命令(实操篇)
linux·运维·前端·网络·chrome·笔记
问道飞鱼1 小时前
【Linux知识】Linux 虚拟机磁盘扩缩容操作指南(按文件系统分类)
linux·运维·服务器·磁盘扩缩容
yaoh.wang1 小时前
力扣(LeetCode) 104: 二叉树的最大深度 - 解法思路
python·程序人生·算法·leetcode·面试·职场和发展·跳槽
egoist20231 小时前
【Linux仓库】超越命令行用户:手写C语言Shell解释器,解密Bash背后的进程创建(附源码)
linux·c语言·bash·xshell·环境变量·命令行参数·内建命令
Lenyiin1 小时前
《 Linux 修炼全景指南: 八 》别再碎片化学习!掌控 Linux 开发工具链:gcc、g++、GDB、Bash、Python 与工程化实践
linux·python·bash·gdb·gcc·g++·lenyiin
莲华君1 小时前
Bash Shell:从入门到精通
linux
风雨飘逸1 小时前
【shell&bash进阶系列】(二十一)向脚本传递参数(shift和getopts)
linux·运维·服务器·经验分享·bash
zly35001 小时前
删除文件(rm 命令 删除目录)
linux·运维·服务器
被AI抢饭碗的人1 小时前
linux:线程池
linux·开发语言
Studying 开龙wu2 小时前
Linux 系统中配置国内源下载时使用pip install 和conda install哪个快?
linux·conda·pip