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

一.  简介

前一篇文章简单介绍了CMakeLists.txt 简单的语法。文章如下:

CMakeLists.txt 简单的语法介绍-CSDN博客

接下来对 CMakeLists.txt语法规则进行具体的学习。本文具体学习 CMakeLists.txt语法规则中常用的命令。

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

cmake 提 供 了 很 多 命 令 , 每 一 个 命 令 都 有 它 自 己 的 功 能 、 作 用 , 通 过 这 个 链 接 地 址 :
https://cmake.org/cmake/help/latest/manual/cmake-commands.7.html

可以查询到所有的命令及其相应的介绍、使用方法等等,如下所示:

大家可以把这个链接地址保存起来,可以把它当成字典的形式在有需要的时候进行查询,由于命令非常多,笔者不可能将所有命令都给大家介绍一遍。
这里给大家介绍一些基本的命令,如下表所示:
command
说明
cmake_minimum_required
设置 cmake 的最低版本号要求
add_executable
可执行程序目标
add_library
库文件目标
add_subdirectory
去指定目录中寻找新的 CMakeLists.txt 文件
aux_source_directory
收集目录中的文件名并赋值给变量
get_target_property
获取目标的属性
include_directories
设置所有目标头文件的搜索路径,相当于 gcc -I 选项
link_directories
设置所有目标库文件的搜索路径,相当于 gcc -L 选项
link_libraries
设置所有目标需要链接的库
list
列表相关的操作
message
用于打印、输出信息
project
设置工程名字
set
设置变量
set_target_properties
设置目标属性
target_include_directories
设置指定目标头文件的搜索路径
target_link_libraries
设置指定目标库文件的搜索路径
target_sources
设置指定目标所需的源文件

2. CMakeLists.txt 语法的部分常用命令

接下来详细地给大家介绍每一个命令。

(1)  add_executable

add_executable 命令用于添加一个可执行程序目标,并设置目标所需的源文件,该命令定义如下所示:
add_executable(<name> [WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL] source1 [source2 ...]) 
该命令提供了一些可选参数,这些可选参数的含义笔者就不多说了,通常不需要加入,具体的含义大家可以自己查看 cmake 官方文档( https://cmake.org/cmake/help/v3.5/command/add_executable.html );只需传入 目标名和对应的源文件即可,譬如:
#生成可执行文件 hello
add_executable(hello 1.c 2.c 3.c)
定义了一个可执行程序目标 hello ,生成该目标文件所需的源文件为 1.c 2.c 3.c 。需要注意的是,源 文件路径既可以使用相对路径、也可以使用绝对路径,相对路径被解释为相对于当前源码路径(注意,这里 源码指的是 CMakeLists.txt 文件,因为 CMakeLists.txt 被称为 cmake 的源码,若无特别说明,后续将沿用这 个概念!)。

(2)  add_library

add_library 命令用于添加一个库文件目标,并设置目标所需的源文件,该命令定义如下所示:
add_library(<name> [STATIC | SHARED | MODULE][EXCLUDE_FROM_ALL]source1 [source2 ...])
第一个参数 name 指定目标的名字,参数 source1…source2 对应源文件列表; add_library 命令默认生成的库文件是静态库文件,通过 SHARED 选项可使其生成动态库文件。
具体的使用方法如下:
#生成静态库文件 libmylib.a
add_library(mylib STATIC 1.c 2.c 3.c)#生成动态库文件 libmylib.so
add_library(mylib SHARED 1.c 2.c 3.c)

add_executable 命令相同, add_library 命令中源文件既可以使用相对路径指定、也可以使用绝对路径指定,相对路径被解释为相对于当前源码路径。
不管是 add_executable 、还是 add_library ,它们所定义的目标名在整个工程中必须是唯一的,不可出现 两个目标名相同的目标。

(3)  add_subdirectory

add_subdirectory 命令告诉 cmake 去指定的目录中寻找源码并执行它,有点像 Makefile include ,其定 义如下所示:
add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
参数 source_dir 指定一个目录,告诉 cmake 去该目录下寻找 CMakeLists.txt 文件并执行它;
参数 binary_dir 指定了一个路径,该路径作为子源码(调用 add_subdirectory 命令的源码称为当前源码或父源码,被执行的 源码称为子源码)的输出文件( cmake 命令所产生的中间文件)目录, binary_dir 参数是一个可选参数,如 果没有显式指定,则会使用一个默认的输出文件目录;
为了后续便于表述,我们将输出文件目录称为 BINARY_DIR。
譬如工程目录结构如下所示:
顶层 CMakeLists.txt 文件内容如下所示:
# 顶层 CMakeLists.txt
cmake_minimum_required("VERSION" "3.5")
project("HELLO")
# 告诉 cmake 去 src 目录下寻找 CMakeLists.txt
add_subdirectory(src)

src 目录下的 CMakeLists.txt 文件:
# src 下的 CMakeLists.txt
add_executable(hello main.c)
进入到 build 目录下,执行 cmake make 进行构建编译;
在本例中,顶层源码对应的输出文件会存放在 build 目录,也就是执行 cmake 命令所在目录;子源码( src 目录下的 CMakeLists.txt )对应的输出文件会存 放在 build/src 目录,包括生成的可执行文件默认会与这些中间文件放置在同一个目录,如下所示:
├── build
│ ├── CMakeCache.txt
│ ├── CMakeFiles
│ ├── cmake_install.cmake
│ ├── Makefile
│ └── src
│ ├── CMakeFiles
│ ├── cmake_install.cmake
│ ├── hello
│ └── Makefile
├── CMakeLists.txt
└── src├── CMakeLists.txt└── main.c
所以由此可知,当前源码调用 add_subdirectory 命令执行子源码时,若没有为子源码指定 BINARY_DIR ,默认情况下,会在当前源码的 BINARY_DIR 中创建与子目录(子源码所在目录)同名的文件夹,将其作为 子源码的 BINARY_DIR

接下来我们修改顶层 CMakeCache.txt 文件:
# 顶层 CMakeLists.txt
cmake_minimum_required("VERSION" "3.5")
project("HELLO")
# 告诉 cmake 去 src 目录下寻找 CMakeLists.txt
add_subdirectory(src output)
指定子源码的 BINARY_DIR output ,这里使用的是相对路径方式。
add_subdirectory 命令对于相对路径的解释为:相对于当前源码的 BINARY_DIR
修改完成之后,再次进入到 build 目录下执行 cmake make 命令进行构建、编译,此时会在 build 目录下生成一个 output 目录,这就是子源码的 BINARY_DIR
设置 BINARY_DIR 可以使用相对路径、也可以是绝对路径,相对路径则是相对于当前源码的
BINARY_DIR,并不是当前源码路径,这个要理解。
通过 add_subdirectory 命令加载、执行一个外部文件夹中的源码,既可以是当前源码路径的子目录、也可以是与当前源码路径平级的目录亦或者是当前源码路径上级目录等等;
对于当前源码路径的子目录,不强制调用者显式指定子源码的 BINARY_DIR;
如果不是当前源码路径的子目录,则需要调用者显式指定 BINARY_DIR,否则执行源码时会报错。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/6504.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Qt问题】VS2019 Qt win32项目如何添加x64编译方式

解决办法&#xff1a; 注意改为x64版本以后&#xff0c;要记得在项目属性里&#xff0c;修改Qt Settings、对应的链接include、lib等 参考文章 VS2019 Qt win32项目如何添加x64编译方式_vs2019没有x64-CSDN博客 有用的知识又增加了~

Spring事件

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;Spring⛺️稳中求进&#xff0c;晒太阳 Spring事件 简洁 Spring Event&#xff08;Application Event&#xff09;就是一个观察者模式&#xff0c;一个bean处理完任务后希望通知其他Bean的…

OpenCV人脸识别C++代码实现Demo

OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉库&#xff0c;它提供了很多函数&#xff0c;这些函数非常高效地实现了计算机视觉算法。 官网&#xff1a;https://opencv.org/ Github: https://github.com/opencv/opencv Gitcode…

微博一级评论爬虫

cookies需要替换成自己的 import requests import requests from lxml import etree import openpyxl from concurrent.futures.thread import ThreadPoolExecutor import re from datetime import datetime, timedelta from urllib import parse from jsonpath import jsonpa…

查找算法与排序算法

查找算法 二分查找 (要求熟练) // C// 二分查找法&#xff08;递归实现&#xff09; int binarySearch(int *nums, int target, int left, int right) // left代表左边界&#xff0c;right代表右边界 {if (left > right) return -1; // 如果左边大于右边&#xff0c;那么…

初始化Linux或者Mac下Docker运行环境

文章目录 1 Mac下安装Docker2 Linux下安装Docker2.1 确定Linux版本2.2 安装Docker2.3 配置加速镜像 3 Docker安装校验4 安装docker-compose4.1 直接下载二进制文件4.2 移动二进制文件到系统路径4.3 设置可执行权限4.4 验证安装 1 Mac下安装Docker mac 安装 docker 还是比较方便…

open3d 处理las点云数据

laspy读取las点云数据 转换格式 open3d 处理:法向量估计 分享给有需要的人,代码质量勿喷。 import numpy as np import os import math import laspy import open3d as o3d# 输入文件夹路径 dirInput = "F://data"# 要筛选的文件后缀 extension = ".las&q…

配置Zephyr编译环境

安装chocolatey 以管理员身份运行PowerShell&#xff0c;然后在PowerShell下执行以下命令&#xff0c;安装chocolatey。 Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol [System.Net.ServicePointManager]::Securi…

自然科学领域基于ChatGPT大模型的科研绘图

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮&#xff0c;可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…

【深度学习实战(32)】模型结构之解耦头(de-coupled head)与耦合头(coupled head)

一、传统耦合头局限性 传统的检测模型&#xff0c;如YOLOv3和YOLOv4&#xff0c;使用的是单一的检测头&#xff0c;它同时预测目标类别和框的位置。然而&#xff0c;这种设计存在一些问题。首先&#xff0c;将类别预测和位置预测合并在一个头中&#xff0c;可能导致一个任务的…

机器学习小tip

有监督学习 有监督学习是通过现有训练数据集进行建模&#xff0c;再用模型对新的数据样本进行分类或者回归分析的机器学习 方法。 无监督学习 而无监督学习&#xff0c;或者说非监督式学习&#xff0c;则是在没有训练数据集的情况下&#xff0c;对没有标 签的数据进行分析并…

Wireshark CLI | 过滤包含特定字符串的流

问题背景 源自于和朋友的一次技术讨论&#xff0c;关于 Wireshark 如何查找特定字符串所在的 TCP 流&#xff0c;原始问题如下&#xff1a; 仔细琢磨了下&#xff0c;基于我对 Wireshark 的使用经验&#xff0c;感觉一步到位实现比较困难&#xff0c;所以想着说用 Wireshark C…

Mybatis Interview Question Summary

1. In best practice, usually an Xml mapping file will write a Dao interface corresponding to it. What is the working principle of the Dao interface? Can the methods in the Dao interface be overloaded when the parameters are different? Answer: The Dao in…

旅游系列之:庐山美景

旅游系列之&#xff1a;庐山美景 一、路线二、住宿二、庐山美景 一、路线 庐山北门乘坐大巴上山&#xff0c;住在上山的酒店东线大巴游览三叠泉&#xff0c;不需要乘坐缆车&#xff0c;步行上下三叠泉即可&#xff0c;线路很短 二、住宿 长江宾馆庐山分部 二、庐山美景

Photoshop中图像编辑的基本操作

Photoshop中图像编辑的基本操作 Photoshop中调整图像窗口大小Photoshop中辅助工具的使用网格的使用标尺的使用注释工具的使用 Photoshop中置入嵌入式对象Photoshop中图像与画布的调整画布大小的修改画布的旋转图像尺寸的修改 Photoshop中撤销与还原采用快捷键进行撤销与还原采用…

机器学习之基于Jupyter多种混合模型的糖尿病预测

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 随着现代生活方式的改变&#xff0c;糖尿病的患病率在全球范围内呈现上升趋势。糖尿病是一种慢性代谢…

上位机图像处理和嵌入式模块部署(树莓派4b使用lua)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 lua是一个脚本语言&#xff0c;比c语言开发容易&#xff0c;也没有python那么重&#xff0c;整体使用还是非常方便的。一般当成胶水语言进行开发&a…

【Hadoop】--基于hadoop和hive实现聊天数据统计分析,构建聊天数据分析报表[17]

目录 一、需求分析 1、背景介绍 2、目标 3、需求 4、数据内容 5、建库建表 二、ETL数据清洗 1、数据问题 2、需求 3、实现 4、扩展概念&#xff1a;ETL 三、指标计算 1、指标1&#xff1a;统计今日消息总量 2、指标2&#xff1a;统计每小时消息量、发送量和接收用…

哥白尼高程Copernicus DEM下载(CSDN_20240505)

哥白尼数字高程模型(Copernicus DEM, COP-DEM)由欧洲航天局(European Space Agency, 简称ESA或欧空局)发布&#xff0c;全球范围免费提供30米和90米分辨率DEM。COP-DEM是数字表面模型(DSM)&#xff0c;它表示地球表面(包括建筑物、基础设施和植被)的高程。COP-DEM是经过编辑的D…

循环神经网络模块介绍(Pytorch 12)

到目前为止&#xff0c;我们遇到过两种类型的数据&#xff1a;表格数据和图像数据。对于图像数据&#xff0c;我们设计了专门的卷积神经网络架构(cnn)来为这类特殊的数据结构建模。换句话说&#xff0c;如果我们拥有一张图像&#xff0c;我们 需要有效地利用其像素位置&#xf…