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

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

  1. 主要对包含的**头文件(#include)和宏定义(#define, #ifdef ...)还有注释**等进行处理;

  2. 预处理之后停止编译过程,生成 *.ii.c 生成的是 .i)文件;

  3. #include 引入的内容被全部复制到预编译文件中,宏定义也会被相应替换处理。

    # -E 仅对源文件进行预处理
    g++  -E test.cpp  -o test.i
    • 最主要的工作:宏命令的替换;
    • #include 单纯导入,可以导入 cpp、txt 文件等等;

编译 *.s

  1. 语法错误检查,检查无误再翻译成汇编语言;

  2. 生成的是和 CPU 架构相关的汇编指令,不同 CPU 架构采用的汇编指令集不同,生成的汇编代码也不一样。

    # -S 产生汇编语言文件后停止编译
    g++  -S test.i  -o test.s

汇编 *.o

  1. g++ 生成:g++ -c test.s -o test.o

  2. 汇编器汇编生成:as test.s -o test.o

  3. 将汇编代码生成机器可执行的二进制目标代码

    # -c 仅把源代码编译为机器语言的目标代码
    g++  -c test.s  -o test.o

链接 bin

  1. 核心工作:解决模块间各种符号(变量、函数)相互引用的问题,除了使用 test.o 还会将静态(动态)库链接一同生成可执行文件

  2. 符号重定位:引用符号(对符号在内存中具体地址的引用),解决当前编译单元如何访问外部符号的问题。

    # -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 timereport time,将测试结果上传到面板;

  • Install time,将项目的目标、源文件、可执行文件和库从构建目录安装到安装位置。

  • CPack timepackaging 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 构建流程

  1. 建立 build 文件夹,并进入 build 目录:mkdir build & cd build

  2. 编译上级目录的 CMakeLists.txt 文件,生成 Makefile 和 其他文件:cmake ..

  3. 执行 make 命令,生成目标:make

  4. 流程图如下,包括三个基本阶段:配置、生成、构建阶段

相关文章:

CMake : Linux 搭建开发 - g++、gdb

目录 1、环境搭建 1.1 编译器 GCC&#xff0c;调试器 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&#xff1a;start-all.sh 启动zookeeper&#xff1a;zkServer.sh start 启动Hive&#xff1a; nohup …...

三大本土化战略支点,大陆集团扩大中国市场生态合作「朋友圈」

“在中国&#xff0c;大陆集团已经走过30余年的发展与耕耘历程&#xff0c;并在过去10年间投资了超过30亿欧元。中国市场也成为了我们重要的‘增长引擎’与‘定海神针’。未来&#xff0c;我们将继续深耕中国这个技术导向的市场。”4月19日上海车展上&#xff0c;大陆集团首席执…...

为什么停更ROS2机器人课程-2023-

机器人工匠阿杰肺腑之言&#xff1a; 我放弃了ROS2课程 真正的危机不是同行竞争&#xff0c;比如教育从业者相互竞争不会催生ChatGPT…… 技术变革的突破式发展通常是新势力带来的而非传统行业的升级改革。 2013年也就是10年前在当时主流视频网站开启分享&#xff1a; 比如 …...

【SpringCloud常见面试题】

SpringCloud常见面试题 1.微服务篇1.1.SpringCloud常见组件有哪些&#xff1f;1.2.Nacos的服务注册表结构是怎样的&#xff1f;1.3.Nacos如何支撑阿里内部数十万服务注册压力&#xff1f;1.4.Nacos如何避免并发读写冲突问题&#xff1f;1.5.Nacos与Eureka的区别有哪些&#xff…...

ChatGPT+智能家居在AWE引热议 OpenCPU成家电产业智能化降本提速引擎

作为家电行业的风向标和全球三大消费电子展之一&#xff0c;4月27日-30日&#xff0c;以“智科技、创未来”为主题的AWE 2023在上海新国际博览中心举行&#xff0c;本届展会展现了科技、场景等创新成果&#xff0c;为我们揭示家电与消费电子的发展方向。今年展馆规模扩大至14个…...

拷贝构造函数和运算符重载

文章目录 拷贝构造函数特点分析拷贝构造函数情景 赋值运算符重载运算符重载operator<运算符重载 赋值运算符前置和后置重载 拷贝构造函数 在创建对象的时候&#xff0c;是不是存在一种函数&#xff0c;使得能创建一个于已经存在的对象一模一样的新对象&#xff0c;那么接下…...

本周热门chatGPT之AutoGPT-AgentGPT,可以实现完全自主实现任务,附部署使用教程

AutoGPT 是一个实验性的开源应用程序&#xff0c;它由GPT-4驱动&#xff0c;但有别于ChatGPT的是&#xff0c;​ 这与ChatGPT的底层语言模型一致。 ​AutoGPT 的定位是将LLM的"思想"串联起来&#xff0c;自主地实现你设定的任何目标。 简单的说&#xff0c;你只用提出…...

Mysql 优化LEFT JOIN语句

1.首先说一下个人对LEFT JOIN 语句的看法&#xff0c;原先我是没注意到LEFT JOIN 会影响到性能的&#xff0c;因为我平时在项目开发中&#xff0c;是比较经常见到很多个关联表的语句的。 2.阿里巴巴手册说过&#xff0c;连接表的语句最好不超过3次&#xff0c;但是我碰到的项目…...

全栈成长-python学习笔记之数据类型

python数据类型 数字类型 类型类型转换整型 intint() 字符串类型转换 浮点型保留整数 int(3.14)3 int(3.94)3浮点型 floatfloat() #####字符串类型 类型类型转换字符串 strstr() 将其他数据类型转为字符串 布尔类型与空类型 布尔类型 类型类型转换布尔型 boolbool()将其他…...

面试|兴盛优选数据分析岗

1.离职原因、离职时间点 2.上一份工作所在的部门、小组、小组人员数、小组内的分工 3.个人负责的目标&#xff0c;具体是哪方面的成本 4.为了降低专员成本&#xff0c;做了哪些方面的工作 偏向于机制、分析方法、思维&#xff0c;当下主要是对于部分高收入专员收入不合理的情况…...

Redis(08)主从复制master-slave replication

文章目录 redis主从复制一. 配置文件的方式设置1. 主节点配置:2. 从节点1配置:3. 从节点2配置: 二. 命令的方式设置1. 创建服务2. 设置主从节点3. 测试 三. 从节点升级为主节点四. 查看主从关系 redis主从复制 Redis主从复制是将一个Redis实例的数据复制到多个Redis实例&#…...

被chatGPT割了一块钱韭菜

大家好&#xff0c;才是真的好。 chatGPT热度一直上升&#xff0c;让我萌生了一个胆大而创新的想法&#xff0c; 把chatGPT嵌入到Notes客户机中来玩。 考虑到我已经下载了一个chatGPT的Notes应用&#xff08;请见《ChatGPT APIs for HCL DOMINO》&#xff09;&#xff0c;想着…...

vue3+ts+pinia+vite一次性全搞懂

vue3tspiniavite项目 一&#xff1a;新建一个vue3ts的项目二&#xff1a;安装一些依赖三&#xff1a;pinia介绍、安装、使用介绍pinia页面使用pinia修改pinia中的值 四&#xff1a;typescript的使用类型初识枚举 一&#xff1a;新建一个vue3ts的项目 前提是所处vue环境为vue3&…...

Apache安装与基本配置

1. 下载apache 地址&#xff1a;www.apache.org/download.cgi&#xff0c;选择“files for microsoft windows”→点击”ApacheHaus”→点击”Apache2.4 VC17”&#xff0c;选择x64/x86&#xff0c;点击右边download下面的图标。 2. 安装apache &#xff08;1&#xff09;把…...

哈夫曼树【北邮机试】

一、哈夫曼树 机试考察的最多的就是WPL&#xff0c;是围绕其变式展开考察。 哈夫曼树的构建是不断选取集合中最小的两个根节点进行合并&#xff0c;而且在合并过程中排序也会发生变化&#xff0c;因此最好使用优先队列来维护单调性&#xff0c;方便排序和合并。 核心代码如下…...

thinkphp:数值(保留小数点后N位,四舍五入,左侧补零,格式化货币,取整,生成随机数,数字与字母进行转换)

一、保留小数点后N位/类似四舍五入&#xff08;以保留小数点后三位为准&#xff09; number_format()函数&#xff1a;第一个参数为要格式化的数字&#xff0c;第二个参数为保留的小数位数 方法一&#xff1a; public function test() {$num 12.56789; // 待格式化的数字$r…...

用Flutter你得了解的七个问题

Flutter是Google推出的一款用于构建高性能、高保真度移动应用程序、Web和桌面应用程序的开源UI工具包。Flutter使用自己的渲染引擎绘制UI&#xff0c;为用户提供更快的性能和更好的体验。 Flutter使用Dart语言&#xff0c;具有强大的类型、效率和易学能力&#xff0c;基本上你…...

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扫描备注&#xff1a;【协议1,协设2〕【目标】扫描 nmap -P0 127.0.0.1如果想知道是如何判断目标主机是否存在可…...

基于ResNet-attention的负荷预测

一、attention机制 注意力模型最近几年在深度学习各个领域被广泛使用&#xff0c;无论是图像处理、语音识别还是自然语言处理的各种不同类型的任务中&#xff0c;都很容易遇到注意力模型的身影。从注意力模型的命名方式看&#xff0c;很明显其借鉴了人类的注意力机制。我们来看…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅!

【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅! 🌱 前言:一棵树的浪漫,从数组开始说起 程序员的世界里,数组是最常见的基本结构之一,几乎每种语言、每种算法都少不了它。可你有没有想过,一组看似“线性排列”的有序数组,竟然可以**“长”成一棵平衡的二…...

基于单片机的宠物屋智能系统设计与实现(论文+源码)

本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢&#xff0c;连接红外测温传感器&#xff0c;可实时精准捕捉宠物体温变化&#xff0c;以便及时发现健康异常&#xff1b;水位检测传感器时刻监测饮用水余量&#xff0c;防止宠物…...

python打卡day49@浙大疏锦行

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 一、通道注意力模块复习 & CBAM实现 import torch import torch.nn as nnclass CBAM(nn.Module):def __init__…...

欢乐熊大话蓝牙知识17:多连接 BLE 怎么设计服务不会乱?分层思维来救场!

多连接 BLE 怎么设计服务不会乱&#xff1f;分层思维来救场&#xff01; 作者按&#xff1a; 你是不是也遇到过 BLE 多连接时&#xff0c;调试现场像网吧“掉线风暴”&#xff1f; 温度传感器连上了&#xff0c;心率带丢了&#xff1b;一边 OTA 更新&#xff0c;一边通知卡壳。…...

__VUE_PROD_HYDRATION_MISMATCH_DETAILS__ is not explicitly defined.

这个警告表明您在使用Vue的esm-bundler构建版本时&#xff0c;未明确定义编译时特性标志。以下是详细解释和解决方案&#xff1a; ‌问题原因‌&#xff1a; 该标志是Vue 3.4引入的编译时特性标志&#xff0c;用于控制生产环境下SSR水合不匹配错误的详细报告1使用esm-bundler…...