CMake : Linux 搭建开发 - g++、gdb
目录
1、环境搭建
1.1 编译器 GCC,调试器 GDB
1.2 CMake
2、G++ 编译
2.1 编译过程
编译预处理 *.i
编译 *.s
汇编 *.o
链接 bin
2.2 G++ 参数
-g
-O[n]
-l、-L
-I
-Wall、-w
-o
-D
-fpic
3、GDB 调试器
3.1 调试命令参数
4、CMake
4.1 含义
4.2 构建树
4.3 常用命令
4.4 构建流程
1、环境搭建
1.1 编译器 GCC,调试器 GDB
sudo apt update # 需要更新
sudo apt install build-essential gdb# 确定版本号
gcc --version
g++ --version
gdb --version
1.2 CMake
sudo apt install cmakecmake --version
2、G++ 编译
2.1 编译过程
编译预处理 *.i
-
主要对包含的**头文件(#include)和宏定义(#define, #ifdef ...)还有注释**等进行处理;
-
预处理之后停止编译过程,生成 *.ii(.c 生成的是 .i)文件;
-
#include 引入的内容被全部复制到预编译文件中,宏定义也会被相应替换处理。
# -E 仅对源文件进行预处理 g++ -E test.cpp -o test.i- 最主要的工作:宏命令的替换;
- #include 单纯导入,可以导入 cpp、txt 文件等等;
编译 *.s
-
语法错误检查,检查无误再翻译成汇编语言;
-
生成的是和 CPU 架构相关的汇编指令,不同 CPU 架构采用的汇编指令集不同,生成的汇编代码也不一样。
# -S 产生汇编语言文件后停止编译 g++ -S test.i -o test.s
汇编 *.o
-
g++ 生成:g++ -c test.s -o test.o
-
汇编器汇编生成:as test.s -o test.o
-
将汇编代码生成机器可执行的二进制目标代码。
# -c 仅把源代码编译为机器语言的目标代码 g++ -c test.s -o test.o
链接 bin
-
核心工作:解决模块间各种符号(变量、函数)相互引用的问题,除了使用 test.o 还会将静态(动态)库链接一同生成可执行文件;
-
符号重定位:引用符号(对符号在内存中具体地址的引用),解决当前编译单元如何访问外部符号的问题。
# -o 产生指定文件名的可执行文件 g++ test.o -o test # g++ test.o test.so test.a添加 **g++ --save-temps **参数,保存编译过程中生成的所有中间文件。
2.2 G++ 参数
-g
-
编译带调试信息的可执行文件;
-
产生能被 GNU 调试器GDB使用的调试信息,以调试程序。
-O[n]
-
优化,例如省略从未使用过的变量、直接将常量表达式用结果值代替等等;
-
-O 对源代码进行基本优化,如-O2,-O3,-On(n 常为0–3) :
-
-O 减小代码的长度和执行时间,等价 -O1;
-
-O0 不做优化;
-
-O1 默认优化;
-
-O2 完成-O1优化之外,还进行一些额外的调整工作,如指令调整等;
-
-O3 包括循环展开和其他一些与处理特性相关的优化工作。
-
-l、-L
-
-l : 指定库文件,如 -lglog ;
-
-L : 指定库文件路径,如 -L/home/lib 。
-I
- 指定头文件搜索路径。
-Wall、-w
-
-Wall :打印警告信息;
-
-w :关闭警告信息。
-o
- 指定输出文件名,如 -o test 。
-D
- 定义预处理宏:-DDEBUG 开启或关闭 DEBUG。
-fpic
-
position-independent code,是否创建与位置无关的目标(可行性文件或共享库);
-
PIC广泛使用于共享库,使得同一个库中的代码能够被加载到不同进程的地址空间中。PIC 还用于缺少内存管理单元的计算机系统中,使得操作系统能够在单一的地址空间中将不同的运行程序隔离开来;
-
地址无关代码能够在不做修改的情况下被复制到内存中的任意位置。这一点不同于重定位代码,因为重定位代码需要经过链接器或加载器的特殊处理才能确定合适的运行时内存地址;
-
cmake: set(CMAKE_POSITION_INDEPENDENT_CODEON)。
3、GDB 调试器
3.1 调试命令参数
$(gdb)help(h) # 查看命令帮助,具体命令查询在gdb中输入help + 命令$(gdb)run(r) # 重新开始运行文件(run-text:加载文本文件,run-bin:加载二进制文件)
$(gdb)start # 单步执行,运行程序,停在第一行执行语句
$(gdb)next(n) # 单步调试(逐过程,函数直接执行)
$(gdb)step(s) # 单步调试(逐语句:跳入自定义函数内部执行)
$(gdb)continue(c) # 继续运行
$(gdb)finish # 结束当前函数,返回到函数调用点
$(gdb)quit(q) # 退出gdb$(gdb)list(l) # 查看原代码(list-n,从第n行开始查看代码。list+ 函数名:查看具体函数)
$(gdb)backtrace(bt) # 查看函数的调用的栈帧和层级关系
$(gdb)info(i) # 查看函数内部局部变量的数值
$(gdb)set # 设置变量的值
$(gdb)display # 追踪查看具体变量值
$(gdb)print(p) # 打印值及地址$(gdb)undisplay # 取消追踪观察变量
$(gdb)watch # 被设置观察点的变量发生修改时,打印显示
$(gdb)i watch # 显示观察点$(gdb)info breakpoints # 查看当前设置的所有断点
$(gdb)enable breakpoints # 启用断点
$(gdb)disable breakpoints # 禁用断点
$(gdb)break+num(b) # 在第num行设置断点
$(gdb)delete breakpoints num(d) # 删除第num个断点$(gdb)x # 查看内存x/20xw 显示20个单元,16进制,4字节每单元
$(gdb)run argv[1] argv[2] # 调试时命令行传参
$(gdb)frame(f) # 切换函数的栈帧
$(gdb)set follow-fork-mode child # Makefile项目管理:选择跟踪父子进程(fork())
4、CMake
CMake 始于 1999 年,当时开发公司 Kitware 被委托设计一套工具来简化研究人员的日常工作软件。目标很明确:提供一组工具,可以在不同平台上配置、构建、测试和部署项目。
4.1 含义
CMake 本身是一个工具集,由五个可执行的程序组成:cmake、ctest、cpack、cmake-gui、ccmake。
-
cmake:用于在构建项目的第一步,进行项目的配置、生成和构建项目的主要可执行文件的工作;
-
ctest:定义测试、测试套件,并设置应该如何执行,用于运行和报告测试结果的测试驱动程序;
-
cpack:为打包需求提供了 DSL,用来生成安装程序和源包的打包程序;
-
cmake-gui:cmake 的图形界面;
-
ccmake:用于图形界面,与 cmake-gui 不同的地方在于ccmake是基于控制台(terminal)的图形界面。

CDash 将项目的测试结果在面板中展示。
-
CMake time,CMake 运行阶段,将处理项目中的 CMakeLists.txt 文件并进行配置;
-
Generation time,配置成功后,CMake 将生成本地构建工具所需的脚本,以执行项目中的后续步骤;
-
Build time,调用编译器,并在特定的构建目录中构建目标。递归的 CMake time 用来实现平台无关的构建;
-
CTest time,运行项目的测试套件,以检查目标是否按预期执行。
-
CDash time 或 report time,将测试结果上传到面板;
-
Install time,将项目的目标、源文件、可执行文件和库从构建目录安装到安装位置。
-
CPack time 或 packaging time,项目打包;
-
Package install time,在系统范围内安装新生成的包。
4.2 构建树
构建的每一个目标,都是树形的结构。

4.3 常用命令
- cmake_minimum_required - 指定CMake的最小版本要求
语法: cmake_minimum_required(VERSION versionNumber [FATAL_ERROR]
- project - 定义工程名称,并可指定工程支持的语言
语法: project(projectname [CXX] [C] [Java])
- set - 显式的定义变量
语法:set(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
set(SRC sayhello.cpp hello.cpp)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
set( CMAKE_BUILD_TYPE Debug )
- include_directories - 向工程添加多个特定的头文件搜索路径
语法: include_directories([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)
include_directories(/usr/include/myincludefolder ./include)
- link_directories - 向工程添加多个特定的库文件搜索路径
语法: link_directories(dir1 dir2 ...)
link_directories(/usr/lib/mylibfolder ./lib)
- add_library - 生成库文件
语法: add_library(libname [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL] source1 source2 ... sourceN)
add_library(hello SHARED ${SRC})
- add_compile_options - 添加编译参数
语法:add_compile_options
add_compile_options(-Wall -std=c++11 -O2)
- add_executable - 生成可执行文件
语法:add_executable(exename source1 source2 ... sourceN)
- target_link_libraries - 为 target 添加需要链接的共享库
语法: target_link_libraries(target library1<debug | optimized> library2...)
- add_subdirectory - 向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置
语法: add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
- aux_source_directory - 发现目录下所有源文件并将列表存储在一个变量中,被用来自动构建源文件列表
语法: aux_source_directory(dir VARIABLE)
-
target_include_directories( swap_lib PUBLIC ${PROJECT_SOURCE_DIR}/include ) - 链接静态库目录
4.4 构建流程
-
建立 build 文件夹,并进入 build 目录:mkdir build & cd build
-
编译上级目录的 CMakeLists.txt 文件,生成 Makefile 和 其他文件:cmake ..
-
执行 make 命令,生成目标:make
-
流程图如下,包括三个基本阶段:配置、生成、构建阶段:

相关文章:
CMake : Linux 搭建开发 - g++、gdb
目录 1、环境搭建 1.1 编译器 GCC,调试器 GDB 1.2 CMake 2、G 编译 2.1 编译过程 编译预处理 *.i 编译 *.s 汇编 *.o 链接 bin 2.2 G 参数 -g -O[n] -l、-L -I -Wall、-w -o -D -fpic 3、GDB 调试器 3.1 调试命令参数 4、CMake 4.1 含义 4.2…...
大数据实战 --- 美团外卖平台数据分析
目录 开发环境 数据描述 功能需求 数据准备 数据分析 RDD操作 Spark SQL操作 创建Hbase数据表 创建外部表 统计查询 开发环境 HadoopHiveSparkHBase 启动Hadoop:start-all.sh 启动zookeeper:zkServer.sh start 启动Hive: nohup …...
三大本土化战略支点,大陆集团扩大中国市场生态合作「朋友圈」
“在中国,大陆集团已经走过30余年的发展与耕耘历程,并在过去10年间投资了超过30亿欧元。中国市场也成为了我们重要的‘增长引擎’与‘定海神针’。未来,我们将继续深耕中国这个技术导向的市场。”4月19日上海车展上,大陆集团首席执…...
为什么停更ROS2机器人课程-2023-
机器人工匠阿杰肺腑之言: 我放弃了ROS2课程 真正的危机不是同行竞争,比如教育从业者相互竞争不会催生ChatGPT…… 技术变革的突破式发展通常是新势力带来的而非传统行业的升级改革。 2013年也就是10年前在当时主流视频网站开启分享: 比如 …...
【SpringCloud常见面试题】
SpringCloud常见面试题 1.微服务篇1.1.SpringCloud常见组件有哪些?1.2.Nacos的服务注册表结构是怎样的?1.3.Nacos如何支撑阿里内部数十万服务注册压力?1.4.Nacos如何避免并发读写冲突问题?1.5.Nacos与Eureka的区别有哪些ÿ…...
ChatGPT+智能家居在AWE引热议 OpenCPU成家电产业智能化降本提速引擎
作为家电行业的风向标和全球三大消费电子展之一,4月27日-30日,以“智科技、创未来”为主题的AWE 2023在上海新国际博览中心举行,本届展会展现了科技、场景等创新成果,为我们揭示家电与消费电子的发展方向。今年展馆规模扩大至14个…...
拷贝构造函数和运算符重载
文章目录 拷贝构造函数特点分析拷贝构造函数情景 赋值运算符重载运算符重载operator<运算符重载 赋值运算符前置和后置重载 拷贝构造函数 在创建对象的时候,是不是存在一种函数,使得能创建一个于已经存在的对象一模一样的新对象,那么接下…...
本周热门chatGPT之AutoGPT-AgentGPT,可以实现完全自主实现任务,附部署使用教程
AutoGPT 是一个实验性的开源应用程序,它由GPT-4驱动,但有别于ChatGPT的是, 这与ChatGPT的底层语言模型一致。 AutoGPT 的定位是将LLM的"思想"串联起来,自主地实现你设定的任何目标。 简单的说,你只用提出…...
Mysql 优化LEFT JOIN语句
1.首先说一下个人对LEFT JOIN 语句的看法,原先我是没注意到LEFT JOIN 会影响到性能的,因为我平时在项目开发中,是比较经常见到很多个关联表的语句的。 2.阿里巴巴手册说过,连接表的语句最好不超过3次,但是我碰到的项目…...
全栈成长-python学习笔记之数据类型
python数据类型 数字类型 类型类型转换整型 intint() 字符串类型转换 浮点型保留整数 int(3.14)3 int(3.94)3浮点型 floatfloat() #####字符串类型 类型类型转换字符串 strstr() 将其他数据类型转为字符串 布尔类型与空类型 布尔类型 类型类型转换布尔型 boolbool()将其他…...
面试|兴盛优选数据分析岗
1.离职原因、离职时间点 2.上一份工作所在的部门、小组、小组人员数、小组内的分工 3.个人负责的目标,具体是哪方面的成本 4.为了降低专员成本,做了哪些方面的工作 偏向于机制、分析方法、思维,当下主要是对于部分高收入专员收入不合理的情况…...
Redis(08)主从复制master-slave replication
文章目录 redis主从复制一. 配置文件的方式设置1. 主节点配置:2. 从节点1配置:3. 从节点2配置: 二. 命令的方式设置1. 创建服务2. 设置主从节点3. 测试 三. 从节点升级为主节点四. 查看主从关系 redis主从复制 Redis主从复制是将一个Redis实例的数据复制到多个Redis实例&#…...
被chatGPT割了一块钱韭菜
大家好,才是真的好。 chatGPT热度一直上升,让我萌生了一个胆大而创新的想法, 把chatGPT嵌入到Notes客户机中来玩。 考虑到我已经下载了一个chatGPT的Notes应用(请见《ChatGPT APIs for HCL DOMINO》),想着…...
vue3+ts+pinia+vite一次性全搞懂
vue3tspiniavite项目 一:新建一个vue3ts的项目二:安装一些依赖三:pinia介绍、安装、使用介绍pinia页面使用pinia修改pinia中的值 四:typescript的使用类型初识枚举 一:新建一个vue3ts的项目 前提是所处vue环境为vue3&…...
Apache安装与基本配置
1. 下载apache 地址:www.apache.org/download.cgi,选择“files for microsoft windows”→点击”ApacheHaus”→点击”Apache2.4 VC17”,选择x64/x86,点击右边download下面的图标。 2. 安装apache (1)把…...
哈夫曼树【北邮机试】
一、哈夫曼树 机试考察的最多的就是WPL,是围绕其变式展开考察。 哈夫曼树的构建是不断选取集合中最小的两个根节点进行合并,而且在合并过程中排序也会发生变化,因此最好使用优先队列来维护单调性,方便排序和合并。 核心代码如下…...
thinkphp:数值(保留小数点后N位,四舍五入,左侧补零,格式化货币,取整,生成随机数,数字与字母进行转换)
一、保留小数点后N位/类似四舍五入(以保留小数点后三位为准) number_format()函数:第一个参数为要格式化的数字,第二个参数为保留的小数位数 方法一: public function test() {$num 12.56789; // 待格式化的数字$r…...
用Flutter你得了解的七个问题
Flutter是Google推出的一款用于构建高性能、高保真度移动应用程序、Web和桌面应用程序的开源UI工具包。Flutter使用自己的渲染引擎绘制UI,为用户提供更快的性能和更好的体验。 Flutter使用Dart语言,具有强大的类型、效率和易学能力,基本上你…...
Nmap使用手册
Nmap语法 -A 全面扫描/综合扫描 nmap-A 127.0.0.1 扫描指定网段 nmap 127.0.0.1 nmap 127.0.0.1/24Nmap 主机发现 -sP ping扫描 nmap -sP 127.0.0.1-P0 无ping扫描备注:【协议1,协设2〕【目标】扫描 nmap -P0 127.0.0.1如果想知道是如何判断目标主机是否存在可…...
基于ResNet-attention的负荷预测
一、attention机制 注意力模型最近几年在深度学习各个领域被广泛使用,无论是图像处理、语音识别还是自然语言处理的各种不同类型的任务中,都很容易遇到注意力模型的身影。从注意力模型的命名方式看,很明显其借鉴了人类的注意力机制。我们来看…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...
