本文介绍在最新的Ubuntu20.04环境中编译最新的GCC编译器的方法。使用这个环境可以学习C++20新特性。 安装Ubuntu20.04 从Ubuntu官网下载最新的安装包并安装。...版本 $ gcc --version 作者的环境中显示gcc当前版本是9.3 安装Git 安装Git包 $ sudo apt install git 确认Git版本 $ git --version...作者的环境中显示如下: 下载GCC源代码 从gcc官网下载代码到src目录中。...配置GCC编译环境 另外创建一个存放编译结果的目录,在这个目录中执行配置命令。...安装GCC $ sudo make install GCC版本切换 使用如下命令增加gcc版本切换选项(例子中添加了gcc9和刚刚编译得到的gcc11) $ sudo update-alternatives
在/usr/lib目录下,可以找到一些静态库文件: gcc/x86_64-linux-gnu/13/libasan.a gcc/x86_64-linux-gnu/13/libgomp.a gcc/x86...在链接时,链接器只复制被程序引用的目标模块,这样可以减少可执行文件在磁盘和内存中的大小。...+.so gcc/x86_64-linux-gnu/13/libtsan.so gcc/x86_64-linux-gnu/13/libgomp.so python3/dist-packages/netplan...Linux系统还允许运行时打桩机制,在程序执行时,可用一个库文件取代另一个库文件,以提高运行性能,或者是获得更多的调试信息。 动态链接是一种JIT(Just-In-Time)过程。...在使用gcc编译生成so时,需要使用-shared -fpic选项; linux还提供了dlopen、dlsym、dlclose函数,支持在程序运行时动态加载和使用共享库。
,从对应的静态库中找到这些符号的定义,并把相关代码段复制到可执行文件中 例如:在 C 语言中,若程序调用了标准输入输出函数printf,链接器会从标准 C 静态库中找到printf函数的实现代码,将其复制到可执行文件中...在程序编译链接阶段,并不把库文件的代码直接复制到可执行文件中 原理: 在编译链接阶段,链接器仅在可执行文件中记录程序所依赖的库文件名称和函数符号等信息 当程序运行时,动态链接器首先会查找并加载程序所依赖的动态库文件...,如果目标运行环境中没有安装所需的动态库,或者动态库的版本不兼容,程序就无法正常运行 性能开销:程序运行时需要动态链接器进行库的加载和符号绑定等操作,会带来一定的运行时性能开销,尤其是在程序启动阶段...带值宏定义:传递动态参数 —> gcc code.c -o code -DM=100 M=100:定义宏M的值为100,等价于在代码最顶部插入:#define M 100 在代码中,可通过 #if M...$(BIN)" # 调试信息:显示清理过程 (1)@符号是干什么用的? @ 符号:是一个命令前缀,作用是隐藏命令本身的输出,只显示命令执行的结果。
关键配置参数对项目构建结果具有直接影响,例如:CMAKE_BUILD_TYPE:控制编译优化级别与调试信息生成,取值范围包括Debug(无优化,含调试符号)、Release(最高优化,无调试信息)、RelWithDebInfo...(优化+调试符号)和MinSizeRel(最小体积优化)。...性能优化实践:在大型项目中,建议:启用增量构建(默认开启),仅重新编译修改过的源文件;配置CMAKE_CXX_FLAGS添加编译器特定优化(如GCC的-O3或Clang的-march=native);使用...以Debug/Release变体为例:filters字段通过正则表达式匹配特定构建类型settings字段则动态调整对应参数:Debug变体启用-O0优化和-g调试符号,Release变体则采用-O3优化并禁用调试信息这种机制支持跨平台开发场景...在跨平台开发中,可通过组合使用实现「一次配置,多环境构建」,显著提升多平台项目的开发效率。
编译时的链接行为 【file指令】 5.3 链接的特殊情况与混合链接 5.4 优缺点对比 5.5 扩展知识:可执行文件格式与调试构建 一、sudo 白名单的配置详解 我们在使用普通用户时,若想用 root...例如,若程序链接了静态数学库,编译后库代码直接 “打包” 进程序,在无对应库的环境中也能运行。 【动态库】: 定义:编译链接时仅记录库引用,程序运行时由运行时链接器加载库。...【补充】: 5.5 扩展知识:可执行文件格式与调试构建 【可执行文件格式】 Linux 下可执行程序采用 ELF(Executable and Linkable Format) 格式,并非简单的二进制流...【debug 与 release 构建】 debug 构建:编译时添加 -g 选项(如 gcc -g hello.c -o hello_debug),生成的程序包含调试信息,可通过 GDB(gdb hello_debug...release 构建:默认不包含调试信息,且可添加优化选项(如 -O2)提升性能(gcc -O2 hello.c -o hello_release),生成的程序体积小、运行快,适合发布。
(1)语法解析的历史约定,一行中以 Tab 开头的内容被视为编译命令 (2)“目标:依赖” 行(如 app: main.o)和 “命令行”(如 gcc main.o -o app)需要严格区分: a....如果找到,它会找文件中的第一个目标文件(target),在下面的例子中,他会找到“hello”这个文件,并把这个文件作为最终的目标文件 当前目录无 .o 一直往下找,找到 .c 当前目录下有,在一步步向上执行生成...配置调试模式 set(CMAKE_BUILD_TYPE Debug) #指定 CMake 的构建类型为 Debug(调试模式) set(CMAKE_CXX_FLAGS_DEBUG “${CMAKE_CXX_FLAGS_DEBUG...} -g -O0”) 作用:为 C++ 代码的调试模式添加额外编译选项。...-g:告诉编译器(GCC/Clang/G++ 等)生成调试符号(包含代码行号、变量信息等),没有这个选项,调试器无法关联源码。
方案 编程环境 编译器 调试器 一 Qt Creator MinGW GCC GDB 二 Qt Creator Microsoft Visual C++ Compiler Debugging Tools...(1)进入软件->菜单->工具->选项->构建和运行->Qt版本->手动设置,添加qmake路径C:\Qt\4.8.5_MinGW\bin\qmake.exe。 ...(3)进入软件->菜单->工具->选项->构建和运行->编译器->手动设置,添加MinGW,并设置相应路径。编译器路径C:\Qt\mingw\bin\gcc.exe。...(3)进入软件->菜单->工具->选项->调试器->CDB Paths->SymbolPaths->插入(鼠标点击小箭头)->符号服务器->确定(默认值)。 ?...(3)进入软件->菜单->工具->选项->调试器->CDB Paths->SymbolPaths->插入(鼠标点击小箭头)->符号服务器->确定(默认值)。 ?
) 在Linux中,我们怎么知道需要安装那些软件呢?...添加白名单用户(大约在第100行左右) 说明:这样任何一个普通用户,想要进入白名单就必须经过管理员同意 编译器 GCC/G++ 编译流程四阶段 源文件 → 预处理 → 编译 → 汇编 → 链接...# 查看可执行文件信息 调试器 GDB Debug vs Release 版本 # 生成可调试版本: gcc -g test.c -o test # 检查是否包含调试信息: readelf -S test...工具调试:复杂问题用 GDB 就像修车:小问题自己看看,大问题才用专业工具 所以不管黑猫白猫,能抓到老鼠的就是好猫,不要觉得自己的方法习惯就是不入流的 ️ 项目自动化构建 Makefile...基本语法 目标文件: 依赖文件 [TAB]依赖方法 简单的 Makefile 示例 # 构建可执行程序 mytest: test.c gcc -o mytest test.c # 清理生成的文件
二、Linux编译器-gcc/g++使用 在 Linux 系统中,gcc 和 g++ 是常用的编译器,用于编译 C 和 C++ 程序。...以下是 gcc 和 g++ 的使用方法和一些常见选项的说明: 2.1 安装 gcc/g++ 如果系统中没有安装 gcc/g++,可以通过包管理器进行安装: 在 Ubuntu/Debian 系列系统上:...2.7 调试 编译时添加 -g 选项,生成包含调试信息的二进制文件: gcc -g -o debug_program program.c 使用 gdb 调试: gdb ....3.5 Makefile 中的特殊符号和自动变量 符号/变量 作用 $@ 当前目标的名字。 $^ 所有依赖项的名字(去重)。 $< 第一个依赖项的名字。 $? 所有比目标文件更新的依赖项。...本篇文章介绍了 Linux 中的核心工具,从软件管理到编译、调试以及自动化构建,希望为您在开发工作中提供实用的参考。
gcc hello.c -o myapp 自定义 -static 强制静态链接 gcc -static hello.c -o hello 独立可执行文件 -g 添加调试信息(GDB用) gcc -g...test.c -o debug 含调试符号 场景化示例 多文件编译 gcc -c utils.c -o utils.o # 编译工具模块 gcc main.c utils.o -o app # 链接主程序与工具...-g:生成调试信息 作用:添加 GDB 调试所需的符号表 等级对比: 等级 信息量 适用场景 -g0 无信息 生产环境 -g1 最小信息 回溯跟踪 -g3 含宏定义 源码级调试 最佳实践: gcc -...自动化构建-make/Makefile Makefile是一种用于自动化编译和构建软件项目的配置文件,而make是一个命令行工具,用于解释和执行Makefile中的规则。...一个工程通常包含海量源文件(如C/C++文件),这些文件按类型、功能或模块分散在多个目录中。
如果不给出这个选项,gcc就给出默认的可执行文件 a.out 。 -g:产生符号调试工具(GNU的 gdb)所必要的符号信息。想要对源代码进行调试,就必须加入这个选项。...(2) -L 如果使用了不在标准位置的库文件,那么可以通过 -L 选项向 gcc 的库文件搜索路径中添加新的目录。...常用的有: (1) -g 和 -ggdb 默认情况下,gcc 在编译时不会将调试符号插入到生成的二进制代码中,因为这样会增加可执行文件的大小。...gcc 在产生调试符号时,同样采用了分级的思路,开发人员可以通过在 -g 选项后附加数字1、2、3指定在代码中加入调试信息的多少。...默认的级别是2(-g2),此时产生的调试信息包括:扩展的符号表、行号、局部或外部变量信息。 级别3(-g3)包含级别2中的所有调试信息以及源代码中定义的宏。
在安装桌面版本 Qt 时,已经默认添加了桌面环境的Qt构建套件: 桌面版本qmake: Qt5.8.0/5.8/gcc_64/bin/qmake 桌面版本编译器: ubuntu 自带的GCC ?...知道了qmake和交叉编译器的路径,下面我们在桌面版本Qt中添加一个开发套件,用于构建嵌入式Qt程序。...添加交叉编译器 打开QtCreator之后,点击菜单栏的 工具->选项->构建和运行->编译器,添加交叉编译器: #添加gcc交叉编译器 名称:ya157c_gcc 路径:/opt/st/stm32mp1...选择构建套件 就是这个程序在哪些平台上运行,我们选择桌面(Desktop Qt 5.8)和开发板(ya157c)这两个套件,如果只选择了一个,在开发过程中也可以再添加其他的构建套件。 ?...4.2 PC运行Qt程序 点击左下绿色三角符号,构建并运行,实际效果: ?
Windows 进入项目根目录下的 Windows 文件夹,在 PowerShell 中执行以下命令: 查看可构建的库列表 ....:Windows 支持将生成的 .pdb 调试符号文件自动复制到 -SymbolDir 指定目录,便于后续崩溃分析与调试。...bash 终端中执行命令: 查看可构建的库列表 ....统一构建类型:所有库默认以 RelWithDebInfo 模式编译——兼顾性能与调试信息,更适合缺乏完善测试环境的实际开发场景。...GitHub 仓库: GISBasic3rdParty Ubuntu (x64) 基于 GCC 13 的构建验证已完成,Docker 镜像支持正在规划中。
⼀个C语⾔的项⽬中可能有多个 .c ⽂件⼀起构建,那多个 .c ⽂件如何⽣成可执⾏程序呢。 • 多个.c⽂件单独经过编译出编译处理⽣产对应的⽬标⽂件。...添加⾏号和⽂件名标识,⽅便后续编译器⽣成调试信息等。 或保留所有的#pragma的编译器指令,编译器后续会使⽤。 经过预处理后的.i⽂件中不再包含宏定义,因为宏已经被展开。...添加⾏号和⽂件名标识,⽅便后续编译器⽣成调试信息等。...汇编的命令如下: gcc -c test.s -o test.o 我们在gcc 环境下看看,将汇编代码翻译成二进制(机器指令) 下面生成的.o文件,这些代码都是二进制的,我们看不懂 在.o文件里还会生成符号表...链接过程主要包括:地址和空间分配,符号决议和重定位等这些步骤。 链接解决的是⼀个项⽬中多⽂件、多模块之间互相调⽤的问题。 ⽐如: 在⼀个C的项⽬中有2个.c⽂件( test.c ?和?
得到二进制文件 -g 编译时添加调试文件,用于 gdb 调试 -Wall 显示所有警告信息 -D 向程序中“动态”注册宏定义 -l 指定动态库库名 -L 指定动态库路径 三、文件后缀名对应表 后缀名 类型...“替代”处理;经过此处理,生成一个没有宏定义、没有条件编译指令、没有特殊符号的输出文件。...添加行号和文件标识,以便编译时产生调试用的行号及编译错误警告行号。 保留所有的 #pragma 编译器指令,因为编译器需要使用它们 下面我们将一端简单的C代码做示例。...例如,某个源文件中的函数可能引用了另一个源文件中定义的某个符号(如变量或者函数调用等);在程序中可能调用了某个库文件中的函数,等等。所有的这些问题,都需要经链接程序的处理方能得以解决。...链接程序的主要工作就是将有关的目标文件彼此相连接,也即将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够被操作系统装入执行的统一整体,也就是可执行程序。
选择一个调试方法。在本例中,我们将使用STM32F411RE核子板中集成了ST-Link的OpenOCD: ? 不要忘记手动选择设备类型。当您手动指定标志时,VisualGDB将无法检测它。...这些选项不兼容gcc,并且会产生智能感知错误。 “-c”和“-o”等指定文件名的选项。它们是由Makefile自动添加的。 下表对示例uVision项目的选项进行了分类: ?...,你将会得到几个错误关于丢失的HAL符号: ?...该文件夹中的源文件实现了各种HAL功能: ? 在解决方案资源管理器中右键单击,选择Add->现有项并向项目添加HAL源文件。然后构建你的解决方案。...重新开始调试您的项目,并验证硬件寄存器现在显示: ? 最后,我们将修复Keil错误消息的解析。由于它们使用的语法与GCC不同,VisualGDB默认不会识别它们。
dwarf调试信息 dwarf调试信息在是elf格式的一部分,编译提示dwarf版本问题,添加-gdwarf-2编译,指定dwarf版本 使用gdb启动文件后,提示dwarf问题导致文件无法调试,gdb...和dwarf版本不兼容 gcc4....*和gcc.5....*之间abi不兼容,导致高版本的软件开发链接需要升级gcc GLIBCXX_版本问题 strings libstdc++.so 查找最新版本的文件 ln -s * libstdc++.so 替换掉文件...(根据错误提示替换掉提示文件) undfine reference nm -C *.so |grep name //查找符号 gcc命令行中使用全路径指定so或者a文件,不用使用-L
"rebuild"字段:表示是否重新构建目标文件。 "build"方法:用来构建静态库。在这个方法中,它首先检查目标文件是否需要重新构建,然后在需要的情况下重新运行GCC生成目标文件。...在此过程中,它会处理包含的变量和类型信息,生成相应的调试信息并添加到DebugContext中。 除了生成调试信息,debuginfo.rs文件还实现了一些其他功能。...总之,debuginfo.rs文件在Rust编译器的GCC后端中负责生成和处理程序的调试信息。它通过迭代处理不同的语法结构,并生成相应的调试信息,为程序调试提供支持。...Sign:这个枚举类型表示数字的符号,可以是正数、负数或者只显示负数的负号。 DebugHex:这个枚举类型表示是否以十六进制格式显示调试信息。...当遍历到特定类型的节点时,会调用对应结构体的方法来处理节点,并将节点中的定义添加到解析器的符号表中。这样,在后续的编译过程中,编译器就可以正确地识别代码中的各种定义了。
-a 列出所有符号(这将会把调试符号也列出来。...默认状态下调试符号不会被列出) -l 列出符号在源代码中对应的行号(指定这个参数后,nm将利用调试信息找出文件名以及符号的行号。...strip(去除二进制文件里面包含的符号) 用途: 可执行程序减肥(通常只在已经调试和测试过的生成模块上,因为不能调试了) 反编译、反跟踪 readelf(显示目标文件详细信息) nm...该可执行程序用-g编译,使之带调试信息。 2. 如果crash在一个so里面,那addr2line不能直接给出代码行。...我们添加9-12行的mtrace调用。 2、编译gcc -g -DDEBUG -o test1 test1.c 3、执行./test1,在目录里会发现./memleak.log。
(1)预处理(Preprocess) 这一步由预处理器完成,对源程序中的伪指令(以#开头的指令)和特殊符号进行处理,伪指令包括宏定义指令、条件编译指令和头文件中包含的指令。...编译时编译器只对单个文件进行处理,如果该文件里面需要引用到其他文件中的符号,比如全局变量或者调用了某个库函数中的函数,那么这时候,在这个文件中该符号的地址是没法确定的,只能由链接器把所有的目标文件链接到一起才能确定最终的地址...如果是集成开发环境,比如VS,这个默认路径一般在VS安装目录下的一个名为 include 的路径下。在Linux中,一般默认路径是 /usr/include 或 /usr/lib 下的目录。...具体使用方法将在我Linux专栏的另一篇文章《自己动手做动态库与静态库》中详细介绍。 (6)-g 生成调试信息 这个选项用于gdb调试的时候,只有在编译的时候加 -g 选项,才能进行gdb调试。...可以看到,加了 -g 选项后,文件变大了,这是因为里面包含了调试所用的信息,关于 -g 选项的更多知识和 gdb 调试相关讲解,将在Linux专栏的另一篇文章《GDB调试器》中详细介绍。