当前位置: 首页 > 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;很明显其借鉴了人类的注意力机制。我们来看…...

华为校招机试 - 批量初始化次数(20230426)

题目描述 某部门在开发一个代码分析工具,需要分析模块之间的依赖关系,用来确定模块的初始化顺序是否有循环依赖等问题。 "批量初始化”是指一次可以初始化一个或多个模块。 例如模块1依赖模块2,模块3也依赖模块2,但模块1和3没有依赖关系,则必须先"批量初始化”…...

WhatsApp CRM:通过 CRM WhatsApp 集成向客户发送消息

WhatsApp CRM&#xff1a;通过 CRM WhatsApp 集成向客户发送消息 你是否在寻找一个支持WhatsApp整合的CRM&#xff1f;或者&#xff0c;你想将WhatsApp与你当前的CRM整合&#xff1f;这篇文章将回答你所有的问题。我们将首先了解什么是WhatsApp CRM&#xff0c;以及你需要知道…...

SOLIDWORKS Electrical无缝集成电气和机械设计

集成电气系统设计SOLIDWORKS⑧Electrical 解决方案借助专为工程专业设计的特定工具简化了电气铲品设计&#xff0c;并借助直观的用户界面更快地设计嵌入式电气系统。 与SOLIDWORKS 3DCAD的原生集成能提供更好的协作与生产效率&#xff0c;同时减少产品延迟、提高设计的一致性与…...

Numpy从入门到精通——数组变形|合并数组

这个专栏名为《Numpy从入门到精通》&#xff0c;顾名思义&#xff0c;是记录自己学习numpy的学习过程&#xff0c;也方便自己之后复盘&#xff01;为深度学习的进一步学习奠定基础&#xff01;希望能给大家带来帮助&#xff0c;爱睡觉的咋祝您生活愉快&#xff01; 这一篇介绍《…...

DJ4-5 路由算法:LS 和 DV

目录 一、迪杰斯特拉算法 1. 术语定义 2. 算法描述 3. 举例说明 4. 构建从源节点到目的节点的路径 5. 构建最低费用路径树 6. 构建转发表 二、距离向量路由算法 1. 术语定义 2. 举例说明 3. 距离向量表 4. 更新距离向量表 5. 举例说明 三、距离向量路由算法 PLUS…...

python图像处理之形态学梯度、礼帽、黑帽

文章目录 简介实战 简介 腐蚀和膨胀是图像形态学处理的基本运算&#xff0c;这两种运算的复合运算构成了开和闭&#xff0c;而腐蚀、膨胀与原图之间的加减操作&#xff0c;则构成了形态学梯度、礼帽和黑帽计算。 由于这几种函数均基于腐蚀和膨胀&#xff0c;所以其参数均与开…...

千万级直播系统后端架构设计

1、架构方面 1.1 基本 该图是某大型在线演唱会的直播媒体架构简图。 可以看出一场大型活动直播涵盖的技术方案点非常庞杂&#xff0c;本节接下来的内容我们将以推拉流链路、全局智能调度、流量精准调度以及单元化部署&#xff0c;对这套直播方案做一个展开介绍。 1.2 推拉流链…...

ImageJ 用户手册——第五部分(菜单命令File,Edit)

这里写目录标题 菜单命令26. File26.1 New26.1.1 Image26.1.2 Hyperstack26.1.3 Text Window26.1.4 Internal Clipboard26.1.5 System Clipboard 26.2 Open26.3 Open Next26.4 Open Samples26.5 Open Recent26.6 Import26.6.1 Image Sequence26.6.2 Raw26.6.3 LUT26.6.4 Text I…...

nmap常用命令

一、nmap简介 Nmap&#xff0c;也就是Network Mapper。nmap是一个网络连接端扫描软件&#xff0c;用来扫描网上电脑开放的网络连接端。确定哪些服务运行在哪些连接端&#xff0c;并且推断计算机运行哪个操作系统(这是亦称 fingerprinting)。它是网络管理员必用的软件之一&…...

常用adb 命令

目录 一、常用简单的adb命令&#xff1a; 二、adb shell pm基本的命令&#xff1a; 三、adb shell am基本的命令&#xff1a; 四、关闭某项进程&#xff0c;以monkey为例&#xff1a; 五、最近12小时的资源情况&#xff1a; 六、录制屏幕命令&#xff1a; 七、截图命令&am…...