当前位置: 首页 > news >正文

Cmake介绍

1.Cmake介绍

  • cmake是一个跨平台的,用于构建项目的工具。
  • 关于项目的构建,我们并不陌生,广为人知的,诸如:makefile(使用make命令),与IDE集成的vs的nmake,linux下的GNU make,Qt的qmake等。
  • 如果自己动手写makefile,就会发现,makefile通常依赖于当前的编译平台,并且编译makefile的工作量比较大,解决依赖关系时通常会出错。cmake恰好可以解决上述问题,其允许开发者指定整个工程的编译流程,再根据编译平台,自动化生成本地的makefile和工程文件,最后用户只需要make编译即可,所以,可以把cmake看成一款自动生成makefile的编译工具,其编译流程如下:

2.Cmake的简单使用

2.1 注释

注释分为单行注释和多行注释

  • 单行注释:#注释内容
  • 多行注释: #[[注释内容]]

2.2基本命令

1.cmake_minimum_required(VERSION ..*)最小版本号
2.project(项目名)
3.add_executable(app a.cpp b.cpp)生成.exe可执行文件

2.3 生成项目构建文件

一般而言,在build文件夹下执行cmake+CMakeLists.txt相对于本目录的路径;然后在执行
make命令编译生成可执行文件,就可以运行了。

3.set的使用

3.1使用set定义变量

例子如下

set(rsc_list a.cpp b.cpp c.cpp d.cpp)//.cpp之间用空格隔开
set(rsc_list a.cpp;b.cpp;c.cpp;d.cpp)//.cpp之间用;隔开add_executable(app ${rsc_list})//使用$对大括号{}中的变量做提取

注意:cmake中变量都是字符串,就算set(r 123),r也是以字符串形式存储

3.2指定使用C++的标准

例子如下

set(CMAKE_XXX_STANDARD 11)//设置C++的标准为11
set(CMAKE_XXX_STANDARD 17)//设置C++的标准为17

3.3指定输出的标准

在cmake中指定可执行程序的输出路径,也对应一个宏,叫做EXECUTABLE_OUTPUT_PATH, 它的值还是通过set来设置
例子如下

set(HOME /home/robin/linux/Sort) //定义一个变量用于存储一个绝对值
set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin)//将拼接好的路径值设置给EXECUTABLE_OUTPUT_PATH宏

4.搜索文件

方式1

在cmake中可以使用aux_source_directory命令来查找某个路径下的所有源文件
例子如下
在介绍例子前,先来介绍两个宏
1.PROJECT_SOURCE_DIR
2.CMAKE_CURRENT_SOURCE_DIR
以上各两个宏代表着CMakeLists.txt所在的目录

aux_source_directory(${PROJECT_SOURCE_DIR} SRC)//将PROJECT_SOURCE_DIR目录下的源文件字符串全部放在SRC中
add_executable(app ${SRC})

方式2

file命令

file(GLOB SRC ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
add_executable(app ${SRC})

5.指定头文件路径

include_directories命令

例子

include_directories(${PROJECT_SOURCE_DIR}/include)

6.通过cmake制作库文件

制作静态库

在cmake中,如果要制作静态库,我们需要如下命令

add_library(库名称 STATIC 源文件)

制作动态库

与制作静态库相似,就是改了一个参数

add_library(库名称 SHARED 源文件)

输出库文件的路径

关键宏:LIBRARY_OUTPUT_PATH

set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/build/library)

7.在程序中链接库文件

首先,我们知道要想在程序中使用库,必须要包含两个文件,一个是提供api信息的.h文件,另一个是存储二进制“源程序”的库文件(windows下的.lib/.dll,linux下的.so,.a)。

7.1在程序中链接静态库

两个关键命令

link_libraries(库名1,库名2,库名3......)#注意,库的名字必须是完整的文件名+扩展名

如果不是系统的库,我们可能需要使用另一个命令来指定库所在路径

link_directories(库的路径,比如${PROJECT_SOURCE_DIR})

7.2在程序中链接动态库

总体来说,链接动态库与链接静态库最大的不同在于生成可执行文件时,库文件的二进制源码并不会合并到可执行文件中,然后从cmake的命令来看,多了一个target
和链接动态库差不多,只不过,第一个命令需要写成,并且需要放在add_executable()后边

target_link_libraries(库名)
link_directories()

8.日志

在cmake中,有一条可以向用户打印信息的命令message

message([] "message to build")

9.变量操作

9.1追加

有时候项目中的源文件不一定在同一个目录中,但是这些源文件最后却需要一起编译来形成最终的可执行文件或者库文件。如果我们通过file命令对各个目录下的源文件进行搜索,最后还需要做一个字符串拼接的操作,关于字符串拼接可以使用set命令,也可以使用list命令
1.使用set拼接
如果使用set命令拼接,对应的格式如下

set(变量名 ${变量名1} ${变量名2}...)

关于上面的命令其实就是将从第二个参数开始往后所有的字符串进行拼接,最后将结果存储到第一个参数中,如果第一个参数中原来有数据,就会对第一个参数进行覆盖
实例

2.使用list追加
如果使用list命令进行拼接,对应的命令格式如下

list(APPEND<list>[<element>...])

9.2字符串移除

1.使用list命令做字符串的移除

9.3其他字符串操作

10.宏定义

在进行程序测试的时候,我们可以在代码中添加一些宏定义,通过这些宏来控制代码是否生效,实例如下

#include<iostream>
int main(){
# ifdef DEBUGstd::cout<<"debug information"<<std::endl;
#endifstd::cout<<"code running"<<std::endl;
}

11.CMake嵌套

12.制作库时链接库

13.实战训练

相关文章:

Cmake介绍

1.Cmake介绍cmake是一个跨平台的,用于构建项目的工具。 关于项目的构建,我们并不陌生,广为人知的,诸如:makefile(使用make命令),与IDE集成的vs的nmake,linux下的GNU make,Qt的qmake等。 如果自己动手写makefile,就会发现,makefile通常依赖于当前的编译平台,并且编译mak…...

Git 生成 ssh key

首先,确保你已经配置了 Git 的用户名和邮箱。打开 Git Bash,执行以下命令: git config --global user.name "你的用户名" git config --global user.email "你的邮箱地址"可以使用 git config --global --list 命令来检查配置是否成功。 打开 Git Bash,…...

基础篇:消息队列理论部分,另一种环境搭建Docker运行RabbitMQ

基础篇:消息队列理论部分,另一种环境搭建Docker运行RabbitMQ消息队列与RabbitMQ初探 本章学习目标理解什么是消息队列以及它解决了什么核心问题。了解RabbitMQ是什么及其在技术生态中的位置。另一种方式在本地使用Docker快速搭建一个RabbitMQ服务。熟悉RabbitMQ的管理控制台。…...

项目案例作业1:学生信息管理系统(面向对象初步接触)

集美大学课程实验报告-项目案例作业1:学生信息管理系统(面向对象初步接触)项目名称 内容课程名称 数据结构班级 网安2413指导教师 郑如滨学生姓名 林沁茹学号 202421336067实验项目名称 项目案例作业1:学生信息管理系统(面向对象初步接触)上机实践日期上机实践时间 2学时一…...

P1097 合唱队形

题目 做法:dp 代码: #include <bits/stdc++.h> using namespace std; int n,ans=-1; int s[1007]; int a[1007]; int b[1007]; int main(){cin >> n;for(int i=1;i<=n;i++){cin >> s[i];}for(int i=1;i<=n;i++){for(int j=0;j<i;j++){if(s[j]&l…...

一生一芯学习:pa2.1 RTFM

一生一芯学习:pa2.1 RTFM前面的内容后面再补,因为近期要C考核了,所以先准备下C考核所需的内容。 RTFSC(2) 整理一条指令在NEMU中的执行结果 从函数中跳转,宏嵌套中慢慢进入最终的代码,人肉gdb一下, 比如在sdb中执行一次si,那么根据cmd_si代码那我们会跳转到cpu_exec()中…...

Linux网络:初识网络 - 详解

Linux网络:初识网络 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-si…...

20250909比赛总结

T1 唐诗题目,维护最大与次大,就做完了,我边界错了(1为最有删除时不对),然后我加了一个1-100的暴力,就过了(浪费nan分钟) 下次写的时候多模拟边界,不要只关注后面的,而且只有打太久(>2h)就下一道...

又寸入生白勺司烤

我一直觉得,我们的人生就像一个凸包,时而高超,时而学习之。人类,一直在这样的高超和低谷下徘徊着,疑惑着,找寻着。那么,在低谷的时候,我们却让洛谷成为了人生的跳楼机,让我们反复升空又落地,这样一来,高超就更为容易了。但又会更快的降落,望着跳楼机窗外的暗红色的…...

Ubuntu 安装 GIPM

一行命令即可 sudo apt-get install gimp安装完后得到的软件:...

手动下载vscode扩展的方法

主要用于离线环境下安装。比如,要下载cpptools,可以使用以下url:https://marketplace.visualstudio.com/_apis/public/gallery/publishers/ms-vscode/vsextensions/cpptools/1.13.9/vspackage?targetPlatform=win32-x64在url中指定版本号和目标平台即可。目前支持的平台如下…...

GAS_Aura-Aura Projectile

1创建了一个火球Actor...

CF1583F Defender of Childhood Dreams

构造比较非人类。 先每 \(k\) 个点分一组,染上同一种颜色,再每 \(k^2\) 个点一组,组内染上同一种颜色,然后依次类推,发现满足条件,可以证明其下界是为 \(\log_k n\) 的。...

scrollArea无法滚动

问题本质 ScrollArea(如 Radix UI、shadcn/ui 等)无法滚动的根本原因是缺乏明确的高度约束。ScrollArea 需要知道自己的确切高度才能计算是否需要显示滚动条。 常见错误模式 // ❌ 错误:ScrollArea 无法获得明确高度 <div className="container"><Scroll…...

时间序列分析(1)

Time Series Problems and Challenges 时间序列问题和挑战 Time series data are a very important source of information. People always tried to analyze time series data to understand the nature of events. Since ancient times, mankind has begun to wonder what li…...

一行代码没写,做了一个小程序

我花了三天时间,准确地说应该是8个小时不到(因为期间《天龙八部》看到四十多回了,停不下来)做了一个微信小程序。 起因是和一个朋友聊到彩票,他说他都是攒好多张了之后,然后一起手动核对有没有中奖。当时我就萌生了做一个小程序的想法,扫一下就能知道是不是又做慈善了。…...

【置顶】欢迎来到 ziyaojia 的主页

这是 HN-CS 最菜的 OIer,你这个神犇敢和他对视 3 秒吗? 洛谷账号:ziyaojia...

copyparty 是一款使用单个 Python 材料实现的内网文件共享软件,具有跨平台、低资源占用等特点,适合需要本地化文件管理的场景

copyparty 是一款使用单个 Python 材料实现的内网文件共享软件,具有跨平台、低资源占用等特点,适合需要本地化文件管理的场景pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &quo…...

ZYNQ Ultrascale+系列部署yolo v10(暂定,若过于艰难则考虑降级或FQ)

YOLO V10模型分析与优化 2.1 YOLO V10模型获取与环境准备 步骤1:创建工作目录结构 # 打开终端,创建项目根目录 mkdir -p ~/yolo_v10_fpga_project cd ~/yolo_v10_fpga_project# 创建详细的目录结构 mkdir -p models/original # 存放原始模型 mkdir -p models/onnx …...

【EF Core】再谈普通实体关系与 Owned 关系的区别

在很多个世纪前,老周曾写过实体之间普通关系(一对一,一对多,多对多)与 Owned 关系的区别。不过,那次写得比较粗浅,逼格不够高,于是,老周厚着脸皮地决定重新写一下。 首先,为什么这次老周用原单词 Owned 呢,官方文档目前的翻译(怀疑是机器干的)为“从属”,这种说法…...

qoj6104 Building Bombing

题意 有 \(n\) 栋建筑,第 \(i\) 栋建筑的高度为 \(a_i\),一座建筑能从左侧看到仅当它左侧的建筑高度都小于它,问你最少需要爆破几座房子,才能使第 \(l\) 座房子成为能看到的第 \(k\) 高建筑。 \(n\le 10^5,k\le 10\)。 思路 首先 \(l\) 要能被看到,因此先把 \(l\) 左边高度…...

必知必会:使用serializers.Serializer在views.py视图文件中序列化和反序列化过程的开发模板

from django.views import Viewclass ProjectTestView(View):"""a.获取所有数据b.创建一条数据"""def get(self, request):"""序列化输出到前端的过程规则:a.创建模型对象b.将上面已创建好的的模型对象传递给序列化器类的instan…...

Cursor小程序实战五:Cursor对接微信两大核心问题

一、对话内容非技术人员的语言 程序员/技术人员的语言比如:回调地址,api,发送请求 ..... 二、微信的两大问题:授权、微信支付 目的是对于非技术人员能够输出一段比较精确的提示词,方便完成功能的开发 1)微信授权登陆 1、永远绕不开用户登陆流程用户登录 手机号验证码…...

电商系统的Mysql表设计是怎么样呢

一、前述 问题1: 电商系统创建订单的逻辑中,如果订单使用了优惠券的话,是会把优惠券直接标在订单表么,还是会单独创建一个表里记录订单和多个优惠券之间的关系 问题2: 如何设计一套mysql数据库的表,可以将订单信息、支付信息、优惠券信息以及商品信息之间关联起来二、实战演练…...

Docker应用 - CloudSaver

CloudSaver 是一个网盘搜索、转存工具。首次部署需要先注册用户,默认管理员注册码 230713。注册进入后可以在设置里修改管理员和用户注册码。用户配置处,可以登录多种网盘授权(可惜现在不支持百度了)。不设置也可以搜索,但不能直接转存。在常见问题可以查找搜索频道(密码…...

SQL查找是否存在,别再count了! - DAYTOY

根据某一条件从数据库表中查询 『有』与『没有』,只有两种状态,那为什么在写SQL的时候,还要SELECT count(*) 呢?无论是刚入道的程序员新星,还是精湛沙场多年的程序员老白,都是一如既往的count 1 目前多数人的写法 多次REVIEW代码时,发现如现现象:业务代码中,需要根据一…...

Cursor小程序实战系列二:如何从原型界面到小程序界面

一、原型界面的生成 在cursor中用以下提示词我想开发一个小程序 目标用户: • 主要用户:25-45岁的家长,没时间来教小孩怎么写作文,也可能不知道还在对应年级作文的写作规范和要求 • 用户痛点:1、家长难以针对孩子写作弱点提供定制化提升方案2、无法获得实时写作建议 我目…...

Cursor小程序实战系列三: 前后端对接保姆级拆解

一、先理解下什么是前后端,为什么叫对接? 二、谁来定义API接口 1、传统的模式 先后端出接口定义,前端人员按照接口定义自己搭建模拟数据,这样的好处是 前端,后端都能同时开发,互不影响 2、cursor模式 三、生成API接口文档 1、最好的方式,在rules中定义接口变化同时更新…...

课前问题思考2

1.方法相关问题 public class Main {static void changeStr(String x) {x = "xyz";}static void changeArr(String[] strs) {for (int i = 0; i < strs.length; i++) {strs[i] = strs[i]+""+i;}}public static void main(String[] args) { String x …...

Cursor小程序实战四:如何让AI写好后端代码

五、用好mermaid流程画图工具...

Web 3

Web 3 更改前题目 题目没有做记录,卡在了最后一步正则绕过,前七个绕过挺简单的 ?A[]=1&B[]=2&C=s878926199a&D[]=0&E=5201.1&F=0xDEADC0DE正则绕过: if (!preg_match(/ls|dir|nl|nc|cat|tail|more|flag|sh|cut|awk|strings|od|curl|ping|\*|sort|ch|zi…...

Cursor小程序实战系列一:0到1开发一个小程序,需求整理、小程序注册备案

一、需求的诞生 某书发表了一片笔记: 家长使用多维表格+DeepSeek对小孩进行作文辅导。痛点两到三个核心功能点这些内容对使用Cursor来生成页面很有帮助AI作文辅导一般的家长辅导孩子作文非常困难,主要原因如下:1、家长难以针对孩子写作弱点提供定制化提升方案 2、无法获得实时…...

深入解析:MySQL 数据类型与运算符详解

深入解析:MySQL 数据类型与运算符详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !importan…...

【前端Vue】如何优雅地在vue中引入ace-editor编辑器 - 指南

【前端Vue】如何优雅地在vue中引入ace-editor编辑器 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …...

USACO08 OPEN Roads Around the Farm S (递归)

(我太垃了,得写点题解提升一下) P2907 [USACO08OPEN] Roads Around The Farm S 题目描述 Farmer John 的奶牛对探索农场周围的领地产生了兴趣。最初,所有 $N$ 头奶牛($1 \leq N \leq 10^9$)以一个大群体的形式开始沿着一条道路旅行。当遇到岔路时,群体有时会选择分成两个…...

dubbo-go example学习记录

dubbo-go example仓库地址: https://github.com/apache/dubbo-go-samples你可以在 https://github.com/apache/dubbo-go-samples/blob/main/README_CN.md 查看中文的README文档快速上手 这个是通过 https://cn.dubbo.apache.org/zh-cn/blog/2021/01/14/快速上手-dubbo-go/ 官方…...

org.apache.commons.lang3.StringUtils工具类中 isEmpty 和 isBlank 的区别 - DAYTOY

1 isEmpty系列 1.1 StringUtils.isEmpty() 说明:是否为空. 可以看到 " " 空格是会绕过这种空判断,因为是一个空格,并不是严格的空值,会导致 isEmpty(" ")=falseStringUtils.isEmpty(null) = true StringUtils.isEmpty("") = true StringUtils.i…...

ubuntu如何查看是否有显卡,显卡型号

在 Ubuntu 系统中,查看是否有显卡以及显卡型号的方法有多种。以下是几种实用的命令,方便你快速获取显卡信息。1. 使用 lspci 查看显卡信息 lspci 命令会列出所有 PCI 设备,包括显卡。 命令bashlspci | grep -i vga输出示例 00:02.0 VGA compatible controller: Intel Corpor…...

赛题

A U607526 「Monkey Mountine Round I」乔迁新居 题目背景 天大的喜事,游荡几十载之后,猴王找到了水帘洞! 但是,洞口较小,不知猴族老小和辎重几次能运完。善武不通文的猴王一代广招贤才,找你算算。 题目描述 共有 \(n\) 只猴子,\(m\) 车辎重。洞口每次可以进入 \(x\) 只…...

JavaScript生成随机数的方法

在JavaScript中,创建随机数可以通过内置的 Math 对象实现。我们将会探讨一些生成随机数的方法,它们在不同场合下都显示出色。 基本的随机数生成 // 生成0到1之间的随机数(不包含1) let randomNumber = Math.random(); Math.random() 函数返回一个浮点数,该数值在0(包括0)…...

LiveOS 的制作简介

LiveOS 用途:便捷启动 LIVEOS 不占用磁盘空间,系统完全在内存文件系统中运行 常用于 linux 系统救援(文件系统异常导致系统进入紧急模式) 常用于制作 PXE 生产测试 DIAG 系统 开源,免费,可定制化程度高制作工具 lorax lorax 项目是 红帽企业版 OS 的安装器的开源项目 套件包…...

.gitignore 文件

...

目标检测 | 基于Weiler–Atherton算法的IoU求解

**交并比(Intersection over Union, IoU)** 是计算机视觉领域中常用的一个评价指标,尤其在目标检测与图像分割任务中,用于衡量预测结果与真实标注之间的重合程度。目标检测 | 基于Weiler–Atherton算法的IoU求解 IoU 交并比(Intersection over Union, IoU) 是计算机视觉领…...

对比Java学习Go——函数、集合和OOP

Go语言的函数支持声明与调用,具备多返回值、命名返回值等特性,结合`func`关键字与类型后置语法,使函数定义简洁直观。函数可作为一等公民传递、赋值或作为参数,支持匿名函数与闭包。Go通过组合与接口实现面向对象编程,结构体定义数据,方法定义行为,接口实现多态,体现了…...

MySQL集群高可用架构 - 指南

MySQL集群高可用架构 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-si…...

【WRF-VPRM 预处理器】HEG 安装(服务器)-MRT专业的工具替代

【WRF-VPRM 预处理器】HEG 安装(服务器)-MRT专业的工具替代pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New"…...

如何在Spring MVC中处理请求参数

在Spring MVC中处理请求参数是通过使用各种注解来实现的。以下是在Spring MVC中处理不同类型请求参数的方法。 使用 @RequestParam注解 当你想要从查询字符串中获取单个参数值时,你可以使用 @RequestParam注解。例如: @GetMapping("/search") public String search…...

redis实现缓存2-解决缓存穿透,缓存击穿

具体实现: ShopServiceImpl package com.hmdp.service.impl;import cn.hutool.core.util.BooleanUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.hmdp.dto.Result; import com.hmdp.entity.Shop; …...

单克隆抗体人源化:从鼠源缺陷到全人源突破,3 大阶段破解临床应用难题

单克隆抗体(McAb)凭借高特异性、强靶向性,在疾病预防、诊断与治疗中占据核心地位。1975 年,Khler 和 Milstein 创立杂交瘤技术,首次实现人工制备 McAb,为生物医药领域开辟新路径。但初代鼠源性 McAb 存在两大关键缺陷,严重限制临床应用:一是免疫原性高,进入人体后易被…...

在Kubernetes中DaemonSet无法在master节点调度的问题

在Kubernetes中,DaemonSet确保全部(或某些特定)Node运行一个Pod的副本。当有Node加入集群时,DaemonSet会自动在新加入的Node上部署Pod。这对于运行像日志收集器、监控代理或其他形式的守护进程非常有用。 默认情况下,出于安全性的考虑,Kubernetes master节点不允许调度普…...