cmake常用命令学习

news2024/10/1 15:30:28

1.include

https://blog.csdn.net/qq_38410730/article/details/102677143

CmakeLists.txt才是cmake的正统文件,而.cmake文件是一个模块文件,可以被includeCMakeLists.txt中。

include指令一般用于语句的复用,也就是说,如果有一些语句需要在很多CMakeLists.txt文件中使用,为避免重复编写,可以将其写在.cmake文件中,然后在需要的CMakeLists.txt文件中进行include操作就行了。

include(file|module)

.cmake文件里包含了一些cmake命令和一些宏/函数,当CMakeLists.txt包含该.cmake文件时,当编译运行时,该.cmake里的一些命令就会在该包含处得到执行,并且在包含以后的地方能够调用该.cmake里的一些宏和函数。

之后有机会再了解什么事宏和函数。

2.protobuf_generate_cpp

protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS foo.proto)

将foo.proto文件生成源码,使用PROTO_SRC,PROTO_HARS变量分别指代生成的cpp和h文件并可用于连接到target和设置include。

要求protobuf_generate_cpp命令和生成add_executable() 或 add_library() 的命令必须在同一个CMakeList中.

 3.file命令

file(GLOB variable [RELATIVE path] [globbingexpressions]...)

file GLOB命令主要用于匹配规则在指定的目录内匹配到所需要的文件。GLOB 会产生一个由所有匹配globbing表达式的文件组成的列表,并将其保存到变量中。(如果指定了RELATIVE 标记,返回的结果将是与指定的路径相对的路径构成的列表。)

如果没有写正则表达式,那么什么文件都匹配不到。例子:

file(GLOB files  *)// 会把文件和文件夹都包含进来
foreach(file IN LISTS files)
    message(STATUS ${file})
endforeach(file)

例子,注意要用双引号,cmake不支持单引号:

打印结果,目录和文件是同等地位,被包含进来:

这段代码的意思是挑选出当前文件下的所有文件,然后打印。

file(MAKE_DIRECTORY [directory1 directory2 ...])

MAKE_DIRECTORY在指定目录处创建子目录,如果它们的父目录不存在,也会创建它们的父目录。

5.add_subdirectory

https://www.jianshu.com/p/07acea4e86a3,添加一个子目录并构建该子目录。

add_subdirectory (source_dir [binary_dir] [EXCLUDE_FROM_ALL])# 绝对路径或当前目录的相对路径 []是可选参数

binary_dir,指定文件输出存放路径。

6.自带变量

https://blog.csdn.net/wzj_110/article/details/116674655, https://juejin.cn/post/6844903999448055815

内置变量

CMAKE_CURRENT_LIST_DIR: 当前处理的'cmake或CMakeListst.txt文件'所在的目录

CMAKE_CURRENT_SOURCE_DIR:指的是当前处理的 CMakeLists.txt 文件所在的路径。 

PROJECT_SOURCE_DIR:项目源文件的目录,如果直接在代码目录下cmake,那么此变量与PROJECT_BINARY_DIR内容相同;

PROJECT_BINARY_DIR:可执行文件的目录。

7.function用法

https://blog.csdn.net/qq_38410730/article/details/102677143

function(<name> [arg1 [arg2 [arg3 ...]]])
  COMMAND1(ARGS ...)            # 命令语句
  COMMAND2(ARGS ...)
  ...
function()

 可以用${arg1}来引用变量。当宏和函数调用的时候,如果传递的是经set设置的变量,必须通过${}取出内容。

function(Foo arg)
  set(${arg} "abc" PARENT_SCOPE)
  message("# After change the value of arg.")
  message("arg = ${arg}")
endfunction()
message("=== Call function ===")
Foo(test)

message("test value = ${test}")


//CMakeLists.txt
cmake_minimum_required(VERSION 3.0)
include(test.cmake)

 打印结果

=== Call function ===
# After change the value of arg.
arg = test  //不太明白这里为什么是test值?
test value = abc

 总之在CMakeLists访问变量就带上${}。

8.add_library() 

add_library(<name> [STATIC | SHARED | MODULE]
            [EXCLUDE_FROM_ALL]
            [source1] [source2 ...])# Normal Libraries
  • 添加名为name的库,name全局唯一;
  • 库的类型是STATIC(静态库)/SHARED(动态库)/MODULE(模块库)之一,生成的library名会根据STATICSHARED成为name.aname.lib;默认是STATIC选项。
add_library(<name> OBJECT [<source>...]) # Object Libraries

创建对象库(Object Library).对象库编译源文件,但不会将其存档或链接到库中。由add_library命令或add_executable命令创建的其它目标可以使用$<TARGET_OBJECTS:objlib>形式的表达式作为源来引用对象,其中objlib是对象库名称。

9.include_directories()

include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 …]) //默认是AFTER

将指定目录添加到编译器的头文件搜索路径之下。相当于g++选项中的-I参数的作用,也相当于环境变量中增加路径到CPLUS_INCLUDE_PATH变量的作用.

使用SYSTEM选项,会把指定目录当成系统的搜索目录。

10.get_filename_component

https://blog.csdn.net/wzj_110/article/details/116431616

cmake获取'文件名'的'特定'部分。

 路径+文件名。

11.add_executable

https://blog.csdn.net/MacKendy/article/details/122549819

基于特定的源文件,创建可执行文件,名为<name>或者<name>.exe(根据平台不同,带exe后缀的是win平台)。

 创建名为<name>的target,这个target在make的时候会编译为可执行文件。编译的源文件为[source1] [source2]…。

https://www.cnblogs.com/dbai/p/17209898.html,add_executable的3种写法,一种是最基础麻烦的,第二是用file命令,第三种是aux但头文件要单独加。

12.aux_source_directory

//语法:
aux_source_directory(<dir> <variable>)

//例子:
//# 查找目录下的所有源文件
//# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)

13.target_include_directories

target_include_directories(<target> [SYSTEM] [AFTER|BEFORE]
  <INTERFACE|PUBLIC|PRIVATE> [items1...]
  [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])

该命令可以指定目标(exe或者so文件)需要包含的头文件路径。命名的<目标>必须是由add_executable()或add_library()之类的命令创建的,并且不能是ALIAS目标。

14.add_dependencies

add_dependencies(<target> [<target-dependency>]...)

明确依赖关系:始终在CMakeLists.txt中明确指定目标间的依赖关系,避免隐式依赖。

例子:【cmake 基础小知识】如何在CMake项目中使用add_dependencies命令管理目标依赖关系-阿里云开发者社区

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

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

相关文章

OBS Studio:如何打造专业级的视频直播体验

1.简介 OBS&#xff08;Open Broadcaster Software&#xff09;是一款开源的视频录制和直播软件&#xff0c;广泛用于视频制作、游戏直播和网络直播。它支持多种操作系统&#xff0c;包括Windows、macOS和Linux。OBS提供了丰富的功能&#xff0c;包括但不限于&#xff1a; **…

聊聊跨境电商平台与固定IP的那些事

IP地址网络地址&#xff08;网络号&#xff09;主机地址&#xff08;地址号&#xff09;&#xff0c;IP地址是一台电脑在网络中的唯一标识&#xff0c;可分为固定IP与动态IP。那么IP地址的分类有哪些&#xff1f;什么IP适合亚马逊/eBay/速卖通等平台运营时使用&#xff1f; A类…

Spring5 的日志学习

我们在使用 Spring5 的过程中会出现这样的现像&#xff0c;就是 Spring5 内部代码打印的日志和我们自己的业务代码打印日志使用的不是统一日志实现&#xff0c;尤其是在项目启动的时候&#xff0c;Spring5 的内部日志使用的是 log4j2&#xff0c;但是业务代码打印使用的可能是 …

DNS安全概述

一、DNS的解析过程 1.递归解析 递归解析是一种由DNS客户端&#xff08;通常是用户的应用程序&#xff0c;如一个浏览器&#xff09;向本地DNS解析器发出解析请求&#xff0c;然后本地DNS解析器负责查询最终结果并将结果返回给客户端&#xff0c;而中间的所有查询请求都由本地D…

每日OJ_牛客HJ62 查找输入整数二进制中1的个数

目录 牛客HJ62 查找输入整数二进制中1的个数 解析代码 牛客HJ62 查找输入整数二进制中1的个数 查找输入整数二进制中1的个数_牛客题霸_牛客网 解析代码 本题是计算一个数二进制表示中1的个数&#xff0c;通过&#xff08;n >> i) & 1可以获取第i位的二进制值&…

基于Spring boot + Vue的校园论坛

作者的B站地址&#xff1a;程序员云翼的个人空间-程序员云翼个人主页-哔哩哔哩视频 csdn地址&#xff1a;程序员云翼-CSDN博客 1.项目技术栈&#xff1a; 前后端分离的项目 后端&#xff1a;Springboot MybatisPlus 前端&#xff1a;Vue ElementUI 数据库&#xff1a; …

聚星文社 聚星3高级推理创作

聚星文社 聚星3高级推理创作 Docshttps://qvfbz6lhqnd.feishu.cn/wiki/D3YLwmIzmivZ7BkDij6coVcbn7W

CAS5.3自定义登录校验规则

前一篇文章介绍过CAS自定义用户信息, 这个用户信息实在登录成功后加到session中的, 今天来介绍一下CAS5.3怎么自定义登录校验逻辑 思路 有了前一篇文章的铺垫这一次自定义登录校验其实就很简单了, 因为想要把用户信息放入到session中是一定要在登陆的时候完成的,因此这次我们…

Codeforces Round 960 (Div. 2) A~E

A. Submission Bait &#xff08;思维&#xff09; 题意&#xff1a; A l i c e Alice Alice 和 B o b Bob Bob 正在玩一个数组 a a a 中大小为 n n n 的游戏。 他们轮流进行操作&#xff0c; A l i c e Alice Alice先开始。无法操作的玩家将输掉。首先&#xff0c;将变量…

常用控件之 QWidget

目录 一、控件概述 1.关于控件体系的发展&#xff1a; 二、QWidget 核心属性 1.核心属性概览 2.enabled 3.geometry &#x1f335;window frame&#xff08;窗口框架&#xff09; 的影响 4.windowTitle 5.windowIcon &#x1f335;使用 qrc 文件管理资源 6.windowOpa…

微信公众号上线12周年了,12年前的公众号历史文章怎么找?抓取了公众号历史文章同步到博客,找起来方便了

为了方便看看12年来这些号发过的文章 2023 批量下载公众号文章内容/话题/图片/封面/视频/音频&#xff0c;导出文章pdf和抓取文章数据包含阅读数/点赞数/在看数/留言数&#xff0c;我抓取了其中一些号的所有历史文章同步到博客 : 比如深圳卫健委从2014年更新&#xff0c;到2023…

Reqable:跨平台HTTP开发与调试工具

在当今快速发展的互联网时代&#xff0c;HTTP协议作为网络通信的基础&#xff0c;其开发和调试工具的选择对开发效率有着重要影响。本文将详细介绍一款新型的跨平台HTTP开发和调试工具——Reqable&#xff0c;它支持HTTP1、HTTP2以及最新的HTTP3(QUIC)协议&#xff0c;为开发、…

超秒集物:助力品牌商腾飞,共筑强国梦想

在当今竞争激烈的商业世界中&#xff0c;每一个小微企业都怀揣着成为世界 500 强的梦想。它们虽然微小&#xff0c;但都在努力绽放出属于自己的光芒。而超秒集物&#xff0c;以其独特的平台力量&#xff0c;为众多小微企业照亮了前行的道路&#xff0c;助力它们追逐梦想&#x…

贝叶斯之光:照亮机器学习领域的算法瑰宝

一、贝叶斯算法概述 贝叶斯算法起源于英国数学家托马斯贝叶斯&#xff08;Thomas Bayes&#xff09;在18世纪提出的贝叶斯定理。该定理是概率论中的一个重要定理&#xff0c;描述了条件概率之间的关系。其基本形式可以表示为&#xff1a; P(A∣B)P(B)P(B∣A)P(A)​ 其中&…

C++进阶:C++11新增语法(1)

文章目录 1. 统一的列表初始化1.1 &#xff5b;&#xff5d;初始化 1.2 std::initializer_list2. 声明2.1 auto2.2 decltype3.3 nullptr 4 范围for循环5 STL中一些变化6 右值引用和移动语义6.1 左值引用和右值引用6.2 左值引用与右值引用特性6.3 左值引用和右值引用使用场景和意…

图的应用--最小生成树

一. 前言 生成树的概念&#xff1a; 生成树是图的极小连通子图&#xff0c;也就是去掉一条边就非连通的图&#xff0c;并且这个图的所有顶点都由边连接在一起&#xff0c;但不存在回路。 生成树的特点&#xff1a;一个图可以有很多个不同的生成树。生成树的顶点个数和图的顶点个…

另一棵树的子树 - 力扣(LeetCode)C语言

572. 另一棵树的子树 - 力扣&#xff08;LeetCode&#xff09;&#xff08;点击前面链接即可查看题目&#xff09; 一、题目 给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在&#xff0c;返回 true &#xff1b;否则&…

反转链表 II(LeetCode)

题目 给你单链表的头指针 和两个整数 和 &#xff0c;其中 。请你反转从位置 到位置 的链表节点&#xff0c;返回 反转后的链表 。 解题 class ListNode:def __init__(self, value0, nextNone):self.value valueself.next nextdef reverseBetween(head: ListNode, lef…

即使是 Linux 用户也应该看看这篇文章。

关注公众号网络研究观获取更多内容。 安全启动至少从 Windows 8 开始就成为一项标准功能。 顾名思义&#xff0c;该功能可保护启动过程。 通过对启动过程中使用的任何软件&#xff08;“固件”&#xff09;进行数字签名&#xff0c;可确保启动过程的完整性。 与任何数字签名…

量产部落SM2258XT开卡软件,SM2258XT主控128G SSD固态卡死修复

故障现象&#xff1a;连接此固态硬盘后电脑就会卡死&#xff0c;拔掉重新连接概率性显示盘符&#xff0c;显示了之后也不能正常操作&#xff0c;一点击打开&#xff0c;电脑就立马卡死。 解决过程&#xff1a;下载了很多款量产工具&#xff0c;都不能开卡成功&#xff0c;点击…