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

相关推荐
chinesegf5 小时前
ubuntu中虚拟环境的简单创建和管理
linux·运维·ubuntu
java_logo5 小时前
2025 年 11 月最新 Docker 镜像源加速列表与使用指南
linux·运维·docker·容器·运维开发·kylin
一碗面4216 小时前
Linux下的网络模型
linux·网络模型
HIT_Weston7 小时前
103、【Ubuntu】【Hugo】搭建私人博客:搜索功能(四)
linux·运维·ubuntu
旖旎夜光7 小时前
Linux(11)(中)
linux·网络
txinyu的博客7 小时前
前置声明与 extern
linux·c++
有泽改之_9 小时前
ssh命令使用
linux·运维·ssh
梁洪飞10 小时前
noc 片上网络
linux·arm开发·嵌入式硬件·arm
颜子鱼12 小时前
Linux驱动-INPUT子系统
linux·c语言·驱动开发
Lueeee.12 小时前
llseek 定位设备驱动实验
linux·驱动开发