CMake保姆级教程

vscode CMake 编译C++项目 ubuntu20.04 环境下操作 保姆级教程 目录 1.安装vscode 2.安装CMake 和gcc 3.安装vscode插件 4.新建HelloWorld工程 4.1新建项目文件夹 4.2配置项目 4.3 构建工程、编译链接和运行 5.注意事项 1.安装vscode 下载地址 Visual Studio Code - Code Editing. Redefined 选择.deb 格式,下载完成后,打开所在文件夹 新建终端,输入sudo dpkg -i code_xxxxxxx.deb... 阅读详情

概述

首先来看看,什么是CMake,它是做什么用的

        众所周知,我们编写的 .c 和 .cpp 等源代码文件无法直接运行,需要经过 预处理 → 编译 → 汇编 → 链接 四个阶段,最终生成可执行文件。这时我们可以通过编写 Makefile 文件,在使用make工具自动化执行上述构建过程,从而生成可执行文件。但是 Makefile 的语法相对比较复杂,有时候没注意写错一点就可能导致构建失败,在大型项目中维护成本就比较高了。
       为了解决 Makefile 在跨平台项目中的维护问题, CMake 就被推广使用了,传统的 Makefile通常依赖于当前平台,若要在不同平台上构建,需要分别编写对应的构建脚本。而使用 CMake 只需编写一次 CMakeList.txt 文件,CMake 会根据目标平台自动生成相应的构建文件,很大程度上简化了跨平台开发流程。

准备工作

这里我使用的是Linux环境进行演示

首先在Linux中下载CMake

下面是几种常见版本的下载指令

Debain/Ubuntu

sudo apt update

sudo apt install cmake -y

CentOS 7:

sudo yum install cmake -y

 RHEL 8 / CentOS 8 / Rocky / AlmaLinux:

sudo dnf install cmake -y

检查是否下载完成

camke --version

若显示版本号就说明已经安装了

编写CMakeLists

准备工作做完后,就先写几个.c文件

首先写一个加法函数

减法函数

写个头文件声明一下

最后写个main函数调用

随后编写CMakeLists.txt文件(文件名千万不能错)

规则

"cmake_minimum_required":指定使用cmake的最低版本(由于编译时是需要本地的cmake进行编译的,所以要写本地camke的版本)

''project":指定工程的名字

"add_executable":添加一个可执行程序,第一个参数是程序的名字,后面的参数都是工程中的源文件名称

注释:

使用#进行单行注释

使用#[[ ]]进行块注释

执行cmake

将CMakeLists  文件编辑好后就可以开始执行cmake

cmake 后跟一个参数(CMakeLists.txt所在的路径 )

这里CMakeLists 就处于当前路径,就可以直接camke .

构建成功后会发现生成了几个文件,其中就包含一个makefile文件

再输入 make 构建一下就生成了之前写的test可执行文件

然后就可以运行了

文件存放

cmake生成的文件和代码源文件放在一块比较乱,就可以创建一个特定的文件夹来存放cmake后的文件,可以起名为bulid

关于CMakeLists

set

1.定义变量

CMakeLists中"add_executable"的第二参数在一个工程中会有很多,直接一个个手写难免出错,于是就可以使用set关键字

set可以将冗杂的文件名全都存储到一个string变量里面

第一个参数VAR就是变量名,中间的VALUE就是所有要存放的文件名,最后一个参数基本用不到不做了解

这里就是后面的文件名都存放在了SRC变量里面 set中的第二个参数可以用空格或者分号隔开

关于参数的写法,必须写成 ${XXX}这样

2.指定使用C++的标准

在CMakeLists中使用

 set(CMAKE_CXX_STANDARD C++标准)

就可以设置构建时使用的C++的标准

除了这样,也可以在cmake时指定

cmake CMakeLists.txt路径 -DCMAKE_CXX_STANDARD=C++标准

3.指定输出的路径

还可以使用set指定可执行程序输出的路径

先将路径存放在一个变量里

set(HOME /home/2025code/test_7_24)

然后使用set指定,这里的EXECUTABLE_OUTPUT PATH是个宏,如果通过set指定了这个宏的值之后,生成的可执行程序就会保存到这个宏指定的路径,如果没找到就会默认生成

set(EXECUTABLE_OUTPUT PATH ${HOME}/bin)

至于后面的\bin则是约定俗成的存放可执行文件的文件夹,也可以不加或者自定义

搜索文件

假如一个项目里的源文件很多,在编写CMakeLists 时也不可能一个个罗列出来,所以就有了搜索文件的指令,只需要搜索相关目录下的源文件就行了

1.aux_source_directory

aux_source_directory(< dir >, < variable >)

该命令共有两个参数,第一个参数dir 就是要搜索的相关目录,第二个参数variable 就是一个变量,这个命令就会将从dir 中搜索到的源文件列表存储到该变量中

2.file

file(GLOB/GLOB_RECURSE 变量名 要搜索的文件类型和文件名)  

这个命令参数不少

首先是第一个参数 GLOB是在指定目录下搜索,而GLOB_RECURSE是在指定目录下递归搜索,意思就是指定目录的所有子目录也搜索

第二个参数就是自定义一个变量,存放所有搜索到的文件列表

第三个参数其实也已是固定的 要么是 PORJECT_SOURCE_DIR (是camke后面跟的路径)要么是 CMAKE_CURRENT_SOURCE_DIR(是CMAKELists文件所处的路径)其实两个宏的意思都一样,写哪个都行

这是具体的例子

搜索当前目录下的src目录的所有.cpp文件

file(GLOB MAIN_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp

这个则是搜素头文件

file(GLOB MAIN_HEAD ${CMAKE_CURRENT_SOURCE_DIR}/include/*.h

通过CMake制作库文件

有时候编写的源代码并不需要编译生成可执行程序,而是生成一些静态库或动态库提供给第三方使用

制作静态库

制作静态库需要使用的命令是:

add_library(库名称 STATIC 源文件1 源文件2...)

在LInux中,静态库的名字分为三部分:lib+库名字+.a,此处只需给出库名就可以了,另外两部分在生成该文件时会自动填充。

Windows中库名可能不同,但也只需给出名字即可

cmake_minimum_required(VERSION 2.8)
project(CALC)
file(GLOB SRC "${CMAKE_CURRENT_SOURCE_DIR}/*.c")
add_library(calc STATIC ${SRC})

这就是生成的静态库

制作动态库

制作动态库需要使用的命令是:

add_library(库名称 SHARED 源文件1 源文件2...)

其实就换了个参数,其他都一样

这是生成的动态库,或许你可以发现,生成的动态库的颜色也是绿色的,这说明它也是个可执行程序,在Linux下

指定输出的路径

适用于动态库

对于生成的库文件来说和可执行程序一样都可以指定输出路径 由于在LInux下生成的动态库默认是有执行权想的

可执行程序的方式去指定它生成的目录

假如说没有lib目录,那么就会自动生成一个

cmake_minimum_required(VERSION 2.8)
project(CALC)
file(GLOB SRC "${CMAKE_CURRENT_SOURCE_DIR}/*.c")
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
add_library(calc STATIC ${SRC})

都适用

由于在Linux下生成的静态库默认不具有可执行权限,所以在指定静态库生成的路径的时候就不能使用EXECUTABLE_OUTPUT_PATH宏了,而应该使用LIBRARY_OUTPUT_PATH,这个宏对应静态库文件和动态库文件都适用。

cmake_minimum_required(VERSION 2.8)
project(CALC)
file(GLOB SRC "${CMAKE_CURRENT_SOURCE_DIR}/*.c")
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib2)
#生成静态库
add_library(calc STATIC ${SRC})
#生成动态库
add_library(calc SHARED ${SRC})

包含库文件

链接静态库

在使用制作出的库文件之前,需要先将库文件发布出去,要发布出去首先需要库文件,可以是静态库也可以是动态库。

然后就是指定头文件(头文件有库文件里定义的一系列函数的声明,因为库文件本身也是由源文件打包的,必须要有头文件才能知道这个库里面有什么东西才能调用库里面的函数,去实现相对应的功能  )

指定头文件

然后下面就是指定静态库的路径,上面制作出的静态库被放在了lib1

在cmake中,链接静态库的命令如下:

link_libraries(<static lib> <static lib>...)

只有一种参数,可以是全名 libxxx.a  也可以是掐头去尾之后的名字 xxx

这个指令的意思就是告诉cmake,除了要链接.c文件外还要链接一个静态库文件

最后因为这个静态库是我们自定义的,系统并不知道它的存在,所有这里还要通过link_directories手动指定这个静态库的地址。

cmake_minimum_required(VERSION 2.8)
project(CALC)
#查找源文件
file(GLOB SRC "${CMAKE_CURRENT_SOURCE_DIR}/*.c")
#包含头文件路径
include_directories(${PROJECT_SOURCE_DIR}/include)
# 链接静态库
link_libraries(calc)
#指定静态库的地址
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/lib1)
#指定生成的可执行文件叫app
add_executable(app ${SRC}

然后就生成了可执行程序app

链接动态库

在 cmake中链接动态库的命令如下:

target_link_libraries(
    <target> 
    <PRIVATE|PUBLIC|INTERFACE> <item>... 
    <PRIVATE|PUBLIC|INTERFACE> <item>......)

参数:

target:指定要加载的库的文件的名字也就是:谁要链接动态库

        该文件可能是个源文件,也可能是个动态库/静态库文件还可能是个可执行程序文件

PRIVATE|PUBLIC|INTERFACE:动态库的访问权限,默认为 PUBLIC

  •  如果各个动态库之间没有依赖关系,无需做任何设置,三者没有区别,一般无需指定,使用默认的PUBLIC即可。
  • 动态库的链接具有传递性,如果动态库A链接了动态库B,C动态库D链接了动态库A,此时动态库D,也相当于链接了动态库B,C,并可以使用动态库B,C中定义的方法。
  • PUBLIC:如果动态库A链接了动态库B,C动态库链接了动态库A,此时动态库C,也相当于链接了动态库B,并可以使用动态库B中定义的方法。
  • PRIVATE:如果动态库A链接了动态库B,B前面加上PRIVATE,C动态库链接了动态库A,此时动态库C,并不能使用动态库B中定义的方法。(这时的传递性只传到A)
  • INTERFANCE:假如动态库A链接B和C时,B和C的前面的权限是INTERFANCE,此时动态库A也可以使用B和C里面的函数,但是并不知道具体用的哪个库里面的

而且动态库的链接通常放在CMakeLIsts文件的最后

#查找源文件
file(GLOB SRC "${CMAKE_CURRENT_SOURCE_DIR}/*.c")
#包含头文件路径
include_directories(${PROJECT_SOURCE_DIR}/include)
#指定静态库的地址
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/lib2)
#指定生成的可执行文件叫app
add_executable(app ${SRC})
#链接动态库
target_link_libraries(app calc)

这样就链接成功了

TwinCAT 3 实战:手把手教你用PLC和C++读写第三方伺服驱动器的CoE参数 本文详细介绍了在TwinCAT 3环境中通过PLC和C++两种技术路线实现对第三方伺服驱动器CoE参数的精准操控。从环境准备到具体实现,包括硬件配置、核心函数使用及性能优化策略,为工程师提供了全面的实战指南。特别针对CoE参数访问的效率和稳定性问题,给出了实用的调试技巧和异常处理方案。 阅读详情

相关推荐

IVP 2021 UNETR: Transformers for 3D Medical Image Segmentation

动机 具有跟踪和扩展路径的全卷积神经网络(FCNNs)(如编码器和解码器),近年来在各种医学图像分割应用中显示出了突出的地位。在这些体系结构中,编码器通过学习全局上下文表示来扮演一个不可或缺的角色,该全局上下文表示将进一步用于解码器的语义输出预测。 卷积层作为FCNN的主要构造块,其局部性限制了此类网络学习长时空间依赖的能力。 在NLP领域,基于transformer的模型已经在各种任务中实现了最先进的基准。transformer中的自我注意机制使他们能够动态地突出词序列的重要特征并学习其长时依赖关系。这

smile909的博客 1979

CMake 保姆级教程(上)

源文件(.cpp / .c)要经过 工具链。

AsherGu的博客 1420

AlphaFold3实战:用它预测抗体结构,我的CDR H3环RMSD降到了2Å以内

本文详细介绍了如何利用AlphaFold3(AF3)高精度预测抗体结构,特别是CDR H3环的建模,其RMSD可降至2Å以内。通过实战演示从序列输入到结构优化的全流程,包括参数配置、置信度指标解读及结果分析,帮助研究人员快速掌握AF3在抗体药物研发中的应用。

weixin_29224529的博客 187

CMake 保姆级教程

CMake 是一个项目构建工具,并且是跨平台的。关于项目构建我们所熟知的还有Makefile(通过 make 命令进行项目的构建),大多是IDE软件都集成了make,比如:VS 的 nmake、linux 下的 GNU make、Qt 的 qmake等,如果自己动手写 makefile,会发现,makefile 通常依赖于当前的编译平台,而且编写 makefile 的工作量比较大,解决依赖关系时也容易出错。蓝色虚线表示使用makefile构建项目的过程红色实线表示使用cmake构建项目的过程跨平台。

Chdaring的博客 1485

零基础搭建本地AI绘画环境:Stable Diffusion 3.5保姆级安装教程(含中文优化方案)

本文提供零基础搭建本地AI绘画环境的详细教程,重点介绍Stable Diffusion 3.5的安装与中文优化方案。从硬件配置检查到软件依赖安装,再到核心组件配置与中文语义增强,教程涵盖全流程操作指南,帮助用户快速掌握AI文生图模型的本地部署技巧,提升创作效率。

weixin_30752699的博客 312

别再只会用QTcpSocket了!手把手教你用QSslSocket为你的Qt网络应用加上SSL/TLS加密(附完整代码示例)

本文详细介绍了如何将Qt网络应用从QTcpSocket迁移到QSslSocket,实现SSL/TLS加密传输。通过对比API差异、解析核心机制和提供完整代码示例,帮助开发者快速掌握安全网络编程技巧,有效防范数据窃听和中间人攻击等安全风险。

weixin_30654583的博客 400

CMake 保姆级教程(上)

CMake 是一个项目构建工具,并且是跨平台的。关于项目构建我们所熟知的还有Makefile(通过 make 命令进行项目的构建),大多是IDE软件都集成了make,比如:VS 的 nmake、linux 下的 GNU make、Qt 的 qmake等,如果自己动手写 makefile,会发现,makefile 通常依赖于当前的编译平台,而且编写 makefile 的工作量比较大,解决依赖关系时也容易出错。而 CMake 恰好能解决上述问题, 其允许开发者指定整个工程的编译流程

qq_47355554的博客 1292

用ESP32-S3+OV2640摄像头+ILI9488屏,DIY一个能联网的智能猫眼(附完整代码)

本文详细介绍了如何利用ESP32-S3微控制器搭配OV2640摄像头和ILI9488显示屏,DIY一个功能强大的智能猫眼系统。从硬件选型、电路设计到软件开发,提供了完整的解决方案和优化技巧,包括图像采集显示、WiFi远程访问及低功耗设计,适合智能家居爱好者动手实践。

weixin_30897233的博客 501

【CMake保姆级教程】包含库文件

在软件开发中,使用库文件和记录日志是常见的任务。库文件(libraries)用于组织和共享代码。本教程将利用CMake,介绍如何在项目中包含库文件,让你轻松掌握这项基本技能。通过本教程,我们学习了如何在CMake中包含库文件。包含库文件是为了在项目中使用外部代码。掌握这项技能将使你的项目更具可维护性和可追踪性。希望这份保姆级教程为你提供了简单而实用的指南,帮助你更好地使用CMake构建和管理你的项目。

m0_62599305的博客 1688

六、大模型(LLMs)参数高效微调(PEFT) 面

链接: https://pan.baidu.com/s/1TYqdCK53tDFEYGtAvpnTbA 提取码: 6a9s。考核中的核心考点,并针对这些考点提供了详尽的解答。通过网盘分享的文件:06大模型(LLMs)参数高效微调(PEFT) 面。)有哪些方法,能不能稍微介绍一下它们间?这种微调方法和全参数比起来有什么劣势吗?能不能总结一下各种参数高效微调方法?高效参数微调,如何进行存储?多种不同的高效微调方法对比。模型显存占用的部分有哪些?微调方法为啥能加速训练?微调计算可训练参数的比例。

weixin_51988935的博客 535

手把手教你学PCIE(10.5)--PCIE故障排除方法的分步排查法介绍

通过以上分步排查法,你可以系统地诊断和解决 PCIe 设备的故障。每个步骤都有助于逐步缩小问题范围,最终找到并解决问题。

MHD0815的博客 1873

CMake学习(上)

关于项目构建我们所熟知的还有Makefile(通过 make 命令进行项目的构建),大多是IDE软件都集成了make,比如:VS 的 nmake、linux 下的 GNU make、Qt 的 qmake等,如果自己动手写 makefile,会发现,makefile 通常依赖于当前的编译平台,而且编写 makefile 的工作量比较大,解决依赖关系时也容易出错。在编写程序的过程中,可能会用到一些系统提供的动态库或者自己制作出的动态库或者静态库文件,cmake中也为我们提供了相关的加载动态库的命令。

weixin_48856218的博客 1036

Python爬虫教程:爬取法院司法拍卖数据全流程实战(附反爬+数据分析方案)

Python爬虫爬取法院司法拍卖数据的核心是模拟真人行为规避反爬+精准解析页面数据+合理处理数据。新手不用一开始就追求高级的反爬技巧和复杂的数据分析,先把基础的分页爬取和数据保存功能跑通,再逐步优化。我做的这个工具现在每周帮朋友爬取全国10个城市的法拍房数据,自动生成分析报告,他说这让他的投资决策效率提升了一倍。如果你们在开发过程中遇到问题,比如反爬失败、数据解析错误,都可以在评论区留言,我会尽力解答。后续我还会出一期爬取京东司法拍卖数据的教程,帮助大家获取更多的法拍数据来源。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2179

【CMake保姆级教程】CMake图文安装教程

CMake是一个项目构建工具,并且是跨平台的。关于项目构建我们所熟知的还有Makefile(通过make命令进行项目的构建),大多是IDE软件都集成了makeVS 的 nmake、linux 下的 GNU make、Qt 的 qmake等,如果自己动手写makefile,会发现,makefile通常依赖于当前的编译平台,而且编写makefile 的工作量比较大,解决依赖关系时也容易出错。我们使用CMake的时候只需要cmake和make一下就可以,非常快速简单。

m0_62599305的博客 7110

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

CMake 保姆级教程(下)

当可执行程序启动之后动态库也不会被加载到内存,只有可执行程序调用了动态库中的函数的时候,动态库才会被加载到内存中,且多个进程可以共用内存中的同一个动态库,所以动态库又叫共享库。再次强调:在使用上面的方式对一个整数区间进行遍历的时候,得到的范围是这样的 【start,stop】,左右两侧都是闭区间,包含 start 和 stop 这两个值,步长 step 默认为1,可以不设置。在遍历列表的时候一共使用了两种方式,一种提供了多个变量来存储当前列表中的值,另一种只有一个变量,但是实际取值的时候需要通过。

1138

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

ubuntu下用cmake编译Qt5(保姆级教程)

0 废话在前 近日想要同时使用Qt和Opencv来完成一个小项目,但是在Qtcreator里面配置Opencv太麻烦,而且考虑到以后也有可能加入更多的第三方库,因此干脆用cmake来进行管理。 目前优快云上的教程基本都是一大抄,并且有许多错误之处,因此干脆自己摸索着写了一版。 观看本教程之前,最好有一定的cmake和Qt编程基础。 1 Qt编译过程 众所周知,C++编译四大步骤:预处理、编译、汇编、链接。 Qt当然...

qq_42823342的博客 7509

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

用VSCode和CMake打造树莓派开发利器 保姆级教程

安装好后,用ssh登录树莓派,在任意地方,输入code,就可以打开vscode了。4.1, 在源文件目录下打开vscode后,vscode看到这个cmake文件后,会自动帮你配置,你只需要等配置好后,点build就行。调试程序停在了main()的第一条指令,然后,可以点单步执行,或者打断点,看执行逻辑和变量了。4.2 第二种方式,就是,自己建立一个build文件夹,进入build文件夹,然后,执行指令。上面是vscode的自动配置,那么点build后,就是下面的情况了。7. 好了,大功告成,亲个嘴儿。

dqsh06的博客 988

CMake 保姆级教程(下)

通过得到的结果我们可以得到一个结论:在进行路径比较的时候,如果使用 PATH_EQUAL 可以自动剔除路径中多余的分割线然后再进行路径的对比,使用 STREQUAL 则只能进行字符串比较。在遍历列表的时候一共使用了两种方式,一种提供了多个变量来存储当前列表中的值,另一种只有一个变量,但是实际取值的时候需要通过。的方式来操作,注意事项:第一个列表对应的编号是0,第一个列表对应的编号是0,第一个列表对应的编号是0。的加强版,我们在遍历一个整数区间的时候,除了可以指定起始范围,还可以指定步长。

qq_47355554的博客 653
上一篇: 操作符与表达式
下一篇: 再探指针与结构体
宴之敖者、
博客等级 码龄4年 131粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值