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

相关推荐
2301_819287121 小时前
ce第六次作业
linux·运维·服务器·网络
CIb0la1 小时前
GitLab 停止为中国区用户提供 GitLab.com 账号服务
运维·网络·程序人生
武汉联从信息1 小时前
如何使用linux日志管理工具来管理oracle osb服务器日志文件?
linux·运维·服务器
Aileen_0v01 小时前
【AI驱动的数据结构:包装类的艺术与科学】
linux·数据结构·人工智能·笔记·网络协议·tcp/ip·whisper
州周2 小时前
Ftp目录整个下载
linux·服务器·数据库
Jackey_Song_Odd2 小时前
Ubuntu 24.04.1 解决部分中文字符(门、径)显示错误的问题
linux·ubuntu
kaixin_learn_qt_ing2 小时前
Linux export命令
linux
余额不足121382 小时前
C语言基础十六:枚举、c语言中文件的读写操作
linux·c语言·算法
冷曦_sole2 小时前
linux-19 根文件系统(一)
linux·运维·服务器
AI大模型学徒2 小时前
Linux(二)_清理空间
linux·运维·服务器