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语法的部分常用命令。

相关推荐
myy-learn24 分钟前
27-进程通信
linux·服务器·网络
按时下班accept25 分钟前
ERA5生成驱动LBM模型的数据
linux
高亦真32 分钟前
今天是学习嵌入式的第32天
linux·学习·算法
gx23482 小时前
k8spod管理
linux·容器·kubernetes
susplus3 小时前
【linux应用软件编程】进程间的通信方式1【管道&IPC】
linux·进程通信·管道·ipc
AlfredZhao6 小时前
用 crontab 给 LLM 使用量装上“监控眼”
linux
刃神太酷啦9 小时前
Linux 系统 MySQL 完整安装配置教程:从卸载 MariaDB 到优化 my.cnf----《Hello MySQL!》(1)
android·linux·c语言·c++·mysql·leetcode·mariadb
赵文宇(温玉)10 小时前
OpenEuler24.03 SP4 系统安装(欧拉/麒麟V10)
linux·openeuler·欧拉
Brilliantwxx11 小时前
【Linux】 进程(7)深度剖析 进程内核O(1)调度队列 + 饥饿问题
linux·运维·服务器
郝学胜-神的一滴12 小时前
Effective Python 条款4:字符串格式化大乱斗
开发语言·网络·python·程序人生·软件工程