GCC工具链使用学习笔记
一、GCC工具链基础概念
GCC(GNU Compiler Collection)是GNU工具链的核心组件,包含预处理器、编译器、汇编器、链接器等工具,支持C、C++、Fortran、Ada等多种编程语言。其编译流程分为四个阶段:
- 预处理:处理
#include
、#define
等指令,生成扩展的.i
文件(示例命令:gcc -E main.c -o main.i
)。 - 编译:将预处理后的文件转换为汇编代码(
.s
文件,示例命令:gcc -S main.i -o main.s
)。 - 汇编:将汇编代码转换为目标文件(
.o
文件,示例命令:gcc -c main.s -o main.o
)。 - 链接:合并目标文件与库文件,生成最终可执行文件(示例命令:
gcc main.o -o main
)。
GCC工具链还包含辅助工具,如ar
(库文件归档)、ld
(链接器)、gdb
(调试器)等,支持静态库(.a
)和动态库(.so
)的编译与链接。
二、GCC工具链核心组件
编译器套件:
gcc
:C语言编译器。g++
:C++语言编译器。ar
:用于创建静态库(示例:ar rcs libadd.a libadd.o
)。ld
:链接目标文件与库(示例:gcc main.o -L. -ladd -o main_static
)。
调试与分析工具:
gdb
:支持断点设置(break main
)、单步执行(next
/step
)、变量查看(print var
)等功能。gcov
:结合gprof
分析程序执行时间。
构建自动化工具:
make
:通过Makefile
自动化编译流程(示例:
执行CC = gcc CFLAGS = -Wall -O2 all: main main: main.o add.o $(CC) $^ -o $@ %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ clean: rm -f *.o main
make
编译,make clean
清理)。
三、GCC工具链使用方法
基础编译命令:
- 编译单个文件:
gcc main.c -o main
。 - 编译多个文件:
gcc file1.c file2.c -o program
。 - 指定输出目录:
gcc main.c -o ./bin/main
。
- 编译单个文件:
编译选项:
- 优化选项:
-O0
:禁用优化(调试用)。-Og
:优化但保留调试信息(开发阶段推荐)。-O2
:平衡优化与编译时间(通用程序推荐)。-Os
:减少代码体积(嵌入式系统推荐)。
- 警告与错误:
-Wall
:启用所有警告。-Werror
:将警告视为错误。
- 架构优化:
-march=native
:自动检测CPU并优化指令。-mfpu=vfpv3
:指定浮点单元(如ARM架构)。
- 优化选项:
静态库与动态库:
- 静态库:
- 编译:
gcc -c libadd.c -o libadd.o
,ar rcs libadd.a libadd.o
。 - 使用:
gcc main.c -L. -ladd -o main_static
。
- 编译:
- 动态库:
- 编译:
gcc -shared -fPIC libadd.c -o libadd.so
。 - 使用:
gcc main.c -L. -ladd -o main_shared
,export LD_LIBRARY_PATH=.
。
- 编译:
- 静态库:
四、交叉编译工具链使用
交叉编译指在一台主机(如x86)上编译生成另一台目标机(如ARM)的可执行文件。步骤如下:
安装交叉编译工具链:
- Ubuntu/Debian系统:
sudo apt install gcc-arm-linux-gnueabihf
。 - 手动构建(以ARM为例):
- 下载源码:
binutils-2.24.tar.bz2
、gcc-4.8.0.tar.bz2
、glibc-2.17.tar
。 - 配置与编译:
# 配置binutils ../../src/binutils-2.24/configure --prefix=/toolchain --target=arm-linux-gnueabi make -j10 && make install # 配置bootstrap GCC ../../src/gcc-4.8.0/configure --target=arm-linux-gnueabi --prefix=/toolchain --with-sysroot=/toolchain/sysroot --enable-languages=c make all-gcc install-gcc # 配置glibc CC=arm-linux-gnueabi-gcc ../../src/glibc-2.17/configure --host=arm-linux-gnueabi --prefix=/usr --with-headers=/toolchain/sysroot/usr/include make && make install install_root=/toolchain/sysroot # 配置最终GCC ../../src/gcc-4.8.0/configure --target=arm-linux-gnueabi --prefix=/toolchain --enable-languages=c,c++ make all && make install
- 下载源码:
- Ubuntu/Debian系统:
交叉编译示例:
- 编译ARM 64位程序:
命令:#include <stdio.h>int main() {printf("Hello, ARM!\n");return 0;}
aarch64-linux-gnu-gcc hello.c -o hello_arm64
。 - 验证:通过
file hello_arm64
检查输出是否为ELF 64-bit LSB executable, ARM aarch64
。
- 编译ARM 64位程序:
环境变量配置:
- 解压工具链后,将
bin
目录添加到PATH
:export PATH=$PATH:/home/lsf/source/gcc-4.6.4/bin
- 解压工具链后,将
五、常见问题与解决方案
问题:交叉编译后程序在目标机无法运行。
- 原因:主机架构与目标机不匹配。
- 解决:使用
file
命令检查可执行文件架构,确保使用正确的交叉编译工具链。
问题:链接时提示库未找到。
- 原因:库路径未指定或库文件缺失。
- 解决:通过
-L
指定库路径,-l
指定库名,或检查LD_LIBRARY_PATH
环境变量。
问题:调试时变量值显示异常。
- 原因:未启用调试信息。
- 解决:编译时添加
-g
选项,如gcc -g main.c -o main
。
相关文章:
GCC工具链应用学习笔记
GCC工具链应用学习笔记pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-size: 1…...
初始化 MCP 环境 创建 MCP Server (一)
1、进入 python3 的 Miniconda 虚拟环境创建及进入方法,参见: https://www.cnblogs.com/rslai/p/18741276 2、安装 fastmcp 库pip install fastmcp安装成功后执行 pip list | grep fastmcp 可以查看已经安装 fastmcp 。如下图 3、创建 server 项目 A)新建一个目录,例如 m…...
博客园格式设置
一级标题 1 正文 zhengwen 正文 zhengwen 二级标题 1.1 正文 zhengwen 正文 zhengwen print("hello worldhello world"hello world"hello world"hello world"hello world"hello world"hello world"hello world"hello world&q…...
[总结/备赛]备战 CSP-S 2025 初赛总结
被拉到dl24jp集训一整天(我的作业啊啊啊啊啊) 1.排序算法 主要考察稳定性,时间复杂度,原理 1.1.插入排序最佳时间复杂度:\(O(n)\) 最差时间复杂度:\(O(n^2)\) 平均时间复杂度:\(O(n^2)\) 是否稳定:是 1.2.希尔排序(优化插入排序) 就是把元素分组,每组gap个,对gap中的元…...
win11 系统如何进行硬盘分区?固态硬盘怎么分区?SSD 固态硬盘是分区好还是不分区好?
win11 系统如何进行硬盘分区?固态硬盘怎么分区?SSD 固态硬盘是分区好还是不分区好?电脑硬盘分区教程 win11本身就有自带的分区功能,所以不用借肋第三方软件也能分区,下面开始分享分区方法。 win11其实和win10差不多,功能也差不多,如果分区过win10可能都不用学就会。 理解…...
逆序数及其应用
刷手机的时候看到一个逆序数的算法题,刚好又在复习矩阵论,行列式里也有用到逆序数,想到大二时学的逆序数计算算法,回顾了一下,并写下这篇文章记录。 1. 定义 假设有一个排列\(a_1,a_2,\dots,a_n\),如果下标对\(\langle i,j \rangle\)满足\(i \lt j\)而\(a_i > a_j\),…...
豆豆守护如何下载?
豆豆守护是一款保护隐私数据工具软件,为开发者提供完善的测试环境。其每个安卓版本都会进行适配,作为开发者的我们如何对豆豆守护进行下载呢? 传送门:豆豆守护助手...
Java运行时jar时终端输出的中文日志是乱码
运行Jar时在控制台输出的中文日志全是乱码,这是因为cmd/bash默认的编码是GBK,只要把cmd的编码改成UTF-8即可两种方式修改:临时修改和注册表永久修改 临时修改 只对当前的cmd页面有效,关闭后重新打开都会恢复成GBK, 打开cmd,输入以下命令 chcp 65001AI写代码这样既可以更改…...
ZK2真空发生器日常清理
“过滤器”的拆卸方法 1.手拧或者内六角塞进去(不要用圆头,会打滑),顺着箭头方向顺时针旋转90,即可将连接器抽出2.更换滤芯 确保严丝合缝真空发生器滤芯 ZK2-FE1-3-A(1套10个) 产线零件盒3.装回时,逆着箭头旋转至横线与“LOCK”标记重合...
Nacos服务注册与发现
一、前提条件 你已经安装好Nacos客户端 二、添加对于的依赖到pom文件 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency><groupId>com.…...
马的遍历
2025.9.14 曹立 题目内容 有一个 \(n \times m\) 的棋盘,在某个点 \((x,y)\) 上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步 输入描述 输入只有一行四个整数,分别为 \(n,m,x,y\) 输出描述 一个 \(n \times m\) 的矩阵,代表马到达某个点最少要走几步(不能到达…...
20231310王宏邦《密码系统设计》第1周
20231310王宏邦《密码系统设计》第1周 学习内容《Windows C/C++加密解密实战》第 1,2 章:1、第⼀章概念复习; 2、第⼆章主要在 Linux(Ubuntu,openEuler)上把软件更新到最新版(3.0版本以上)。bang@LAPTOP-74GS6JSR:~$ openssl version OpenSSL 3.0.2 15 Mar 2022 (Library: …...
新学期第一次随笔:慢慢学,总会有进步
一、关于我:爱游戏也想学好知识的普通学生 大家好,我是一名大三学生,平时最大的爱好是打《CS:GO》,空闲时也会玩《我的世界》(MC)。打《CS:GO》时喜欢和队友配合冲锋,既是无畏的冲锋手也是冷静的狙击手,每次赢下对局都特别有成就感;玩MC时总爱研究怎么用指令搭一些自动…...
详细介绍:【C语言】第四课 指针与内存管理
详细介绍:【C语言】第四课 指针与内存管理pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !impo…...
知识点错题整理
1:【子串里面包含空串】12+1=13【一个字符串中任意个连续的字符组成的子序列称为该字符串的子串,则字符串 abcab 有(13 )个内容互不相同的子串】...
202311_陇剑杯预赛_tcpdump
流量分析,应急响应Tags:流量分析,应急响应 0x00. 题目 附件路径:https://pan.baidu.com/s/1GyH7kitkMYywGC9YJeQLJA?pwd=Zmxh#list/path=/CTF附件 附件名称:202311_陇剑杯预赛_tcpdump.zip题目描述:攻击者通过暴力破解进入了某Wiki 文档,请给出登录的用户名与密码,以:拼接…...
Linux学习记录(六):添加/删除用户
添加/删除用户 sudo useradd -m -d /home/newuser -s /bin/bash newusersudo passwd newuser新建/删除用户su: Super User即系统管理员 useradd: 新建用户 userdel: 删除用户 passwd : 修改密码...
python 链式调用 合并 __setattr__ __getattribute__ in nested object()
使用场景:bpy.types.Scene与bpy.context.scene部分功能重叠。 def Get(obj, attr: str | Sequence[str], root=False):"""injected recursive getattr, could pollute objects on chain in whole session"""IS_STR = isinstance(attr, str)if I…...
分享一个稳定好用的免费云服务——阿贝云体验
最近在搭建个人小项目,一直在寻找稳定的免费云服务器资源,偶然发现了「阿贝云」,用了几天感觉非常不错,特地来分享一下使用体验。 阿贝云提供了免费虚拟主机和免费云服务器,对于像我这样刚开始学习建站或者想做点小实验的用户来说非常友好。注册流程简单,开通也很快,控制…...
年化439%,回撤7%,卡玛比率62.5,附本地运行的完整策略python代码 - 详解
年化439%,回撤7%,卡玛比率62.5,附本地运行的完整策略python代码 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Couri…...
接口测试---PyMysql
PyMysql数据库操作代码安装 : pip install PyMySQL数据库应用场景校验测试数据 :http请求发送后,明确会修改表中的数据,但响应结果中没体现如删除员工(is_delete字段)构造测试数据 :测试数据使用一次就失效,不能重复使用 : 添加员工(手机号码字段)测试数据在展开测试前无法确定…...
My First Blog
被你发现啦~...
设置基础软件仓库时出错
1.安装源报设置基础软件仓库时出错2.点击【网络和主机名】,把网络设置成静态网络,能够访问外网3.点击【安装源】,在网络上这块输入这个网址 https://update.cs2c.com.cn/NS/V10/V10SP3-2403/os/adv/lic/base/x86_64/ ,之后点【完成】...
linux c应用性能与内存泄露问题排查工具
GCC内置的内存检测工具在 GCC 中,对 -fsanitize=address(AddressSanitizer, ASan)、-fsanitize=leak(LeakSanitizer, LSan) 和 -fsanitize=memory(MemorySanitizer, MSan) 的支持情况如下:-fsanitize=address(AddressSanitizer - ASan)支持:是可用版本:…...
深入解析:AI-调查研究-66-机器人 机械臂 软件算法体系:轨迹规划视觉定位力控策略
深入解析:AI-调查研究-66-机器人 机械臂 软件算法体系:轨迹规划视觉定位力控策略pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &qu…...
VS Code快捷键
VS Code 1.通用操作快捷键快捷键 功能Ctrl+Shift+P 打开命令面板Ctrl+Shift+N 新建窗口Ctrl+S 保存Ctrl+P 搜索打开文件2.代码编辑快捷键快捷键 功能Ctrl+Z 撤销Ctrl+Shift+Z 反撤销Ctrl+C 复制Ctrl+X 剪切Ctrl+V 粘贴Ctrl+F 查找Ctrl+H 替换Ctrl+A 全选Shift+Alt+F 格式化代码…...
API安全厂商综合推荐:2025年权威视角下的主流厂商评估与选型指南
API安全厂商综合推荐:2025年权威视角下的主流厂商评估与选型指南基于IDC 2024年度报告,推荐全知科技、奇安信、腾讯云、华为、保旺达,启明星辰、安恒信息,安华金和、美创科技等API安全厂商,适用于金融、政务、运营商等行业客户,支持AI赋能运营提效70%、资产发现纯净度95%…...
基于FPGA的8PSK+帧同步系统verilog开发,包含testbench,高斯信道,误码统计,可设置SNR
1.算法仿真效果 vivado2019.2仿真结果如下(完整代码运行后无水印):设置SNR=10db设置SNR=30db仿真操作步骤可参考程序配套的操作视频。2.算法涉及理论知识概要随着通信技术的不断发展,相位调制技术因其高频谱效率和抗干扰能力而广泛应用于无线通信系统中。其中,8PSK(8相位…...
去去就来
一脚踢开也许从来没有面临过 看着天空就要泪流下 不是为了具体的人 不是为了具体的事 或者说 每个人都是凶手 下雨这天好安静 也不再盼望放晴 扭转时空又如何挽回 时差 禀赋没有破土 在一切都爆发之前 万物缄默 不甘与嫉恨 人性共扭曲 下位者的祈愿 愿你跌入深渊 所谓的思维 究…...
高三试卷
福建省2024-2025学年高三年级下学期模拟(一模&二模&三模)物理试题试卷汇总 https://www.zxxk.com/docpack/3497855.html...
豆包生成C#即梦API HTTP调用实例代码
最近玩即梦AI,文生图,文生视频等等很多玩法都很强大。即梦本身页提供了API。官方文档里有Java, Golang, Python, PHP的SDK,官方也推荐使用SDK,调用SDK会比较省事儿。官方也提供了HTTP请求示例代码,但是也只包括Java, Golang, Python, PHP,没有C#。所以就尝试写个C#调用即…...
解析几何笔记
记号约定:\(\displaystyle {x \brack y}\):向量 \((x, y)\)。1. 直线 一些定义:方向向量:与直线 \(l\) 平行的向量。 倾斜角:直线 \(l\) 与 \(y\) 轴正方向同向的方向向量,与 \(x\) 轴正方向的夹角。形式化的,设直线 \(l\) 的方向向量 \(\bold{v}\) 满足 \(\displaystyl…...
基于SOA海鸥优化算法的PID控制器最优控制参数计算matlab仿真
1.课题概述 基于SOA海鸥优化算法的PID控制器最优控制参数计算matlab仿真,通过SOA优化PID的kp,ki,kd三组参数,对比普通的PID控制器的控制效果。 2.系统仿真结果 3.核心程序与模型版本:MATLAB2022a%使用优化后的参数控制PID控制器 for k=1:10000time(k) = k*ts;%设定…...
使用 CUDA 12.9 编译 PyTorch 2.4.0
最近跑的一个项目需要 torch==2.4.0,但是 GPU(NVIDIA RTX PRO 6000)需要 CUDA 12.9,PyTorch 官方这个配置的预编译包,因此需要手动编译。获取源码: git clone -b v2.4.0 --depth 1 https://github.com/pytorch/pytorch cd pytorch git submodule sync git submodule upda…...
详细介绍:boost::circular_buffer的使用方法简介
详细介绍:boost::circular_buffer的使用方法简介pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace…...
基于禁忌搜索算法的TSP问题最优路径搜索matlab仿真
1.程序功能描述 基于禁忌搜索算法的TSP问题最优路径搜索,旅行商问题(TSP)是一个经典的组合优化问题。其起源可以追溯到 19 世纪初,最初是在物流配送、线路规划等实际场景中被提出。简单来说,给定一组城市和城市之间的距离,旅行商需要从一个城市出发,访问每个城市恰好…...
PDD9.14 笔试 - 浪矢
目录Day1 T1Day1 T4 Day1 T1 简单的模拟: 题目内容大概是给一个字符串a,a的子串拼成字符串b。 例如abcd -> abbccd 给你b字符串,要求给出a字符串。 思路:b字符串中除了第一个字符和最后一个字符串外,其他的都是重复字符,隔一个选一个就好。点击查看代码 import java.u…...
增肌,减脂,变瘦的联系和区别
首先,健身的目的基本都是为了好看的体型,肌肉和脂肪匀称的占比,力量和丝滑的结合。如果是运动员或需要针对性训练肌肉的话,那另说。 其次,这里说一下饮食和训练的关系。 俗话说,三分练七分吃。很多人不理解,为什么吃这么重要,但是我各种营养餐,减脂餐,轻食,没少吃,…...
(eval):1: _python-argcomplete: function definition file not found
(eval):1: _python-argcomplete: function definition file not found 我在使用kali的时候每次想使用table键补全命令就会报错,很烦人就是 去网上搜了一下,终于找到了解决方法argcomplete是一个用于Python的命令行参数自动补全工具。它通过与argparse库结合,为Python应用程序…...
详细介绍:【Spring Boot 报错已解决】Web server failed to start. Port 8080 was already in use.
详细介绍:【Spring Boot 报错已解决】Web server failed to start. Port 8080 was already in use.pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "M…...
Nordic Neuton.AI 技术优势;
Nordic Neuton.AI 技术的主要优势包括: 极小模型体积 Neuton.AI 能自动生成极小的机器学习模型,通常仅需几 KB(平均小于 5 KB),比传统框架(如 TensorFlow Lite for Microcontrollers)小 10 倍以上。 自动化建模,无需 ML 专业知识 Neuton.AI 平台无需开发者具备神经网络…...
channel Sounding 工作流程
1、必须要建立连接,并且配对绑定模式; 2、通过发送LL_CS_CONFIG_REQ PDU Select “启动器(Initiator) 或 反射器Reflector; 3、LL_CS_CONFIG_RSP PDU Select “与 DEVICE A 相反的角色 ” 4、启动器( Initiator )和反射器都可以发起channel sounding的流程; 如果对这个…...
基于Zhang-Suen算法的图像细化处理FPGA实现,包含testbench和matlab验证程序
1.算法运行效果图预览 (完整程序运行后无水印)将数据导入到matlab中显示图片:可以看到,图3,通过FPGA细化之后,可以获得和MATLAB一样的效果(图2),两者相对于原图(图1)都实现了图像的细化处理。2.算法运行软件版本 vivado2019.2matlab2024b/matlab2022a3.部分核心程序 (…...
channel Sounding RTT和PBR 属性总结
1、蓝牙联盟规定了有72个信道可以使用,每个信道带宽1M; 2、跳频模式和普通ble 跳频方式是不一样的; 3、channel Sounding 必须要是建立连接的; 4、角色分为启动器和反射器; 6、启动器:计算自身到另一个设备的距离 7、反射器:对启动器进行响应的设备; 8、跳频机制和我们普…...
二分查找方法
/*二分查找方法,前提是这个数组是有序的,无序的先排序 1-100; 50 25 判断结构,循环结构(比较),区间为零时找完,则没有找到 / //public static boolean binarySearch(int[]array,int target) //{//定义左右坐标 // int left=0; // int right=array.length-1; /因为…...
复制一个数组的方法
public class DemoArray { public static void main(String[] args) { int[] array = {1, 2, 3, 4, 5}; int[] array1 = new int[array.length]; // for(int i:array){//特殊方法(遍历数据的时候),只需要输出数据的时候使用 // System.out.println(i); //…...
判断目标是否在数组里面
public static boolean fiandTarget(int[] array,int target){ // boolean flag = false; for (int i = 0; i < array.length; i++) { if (array[i] == target){ return true; //flag = true; } } // return flag; return false; }...
选择排序方法
public static void chooseSort(int[] array){for (int i = 0; i < array.length - 1; i++){//记住索引位置int min = array[i];int minIndex = i;//开始内存比较for (int j = i+1; j < array.length; j++) {// 如果发现比标志的小的,就将赋值给标志位if (array[j] <…...
ArcGIS Pro 遇到严重的应用程序错误而无法启动 - 教程
ArcGIS Pro 遇到严重的应用程序错误而无法启动 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monos…...
第一次作业
大家好我日常有三个常做的事:刷视频、玩游戏、偶尔画画。刷视频时,我不只是看娱乐内容,遇到 “Python 基础操作”“PS 简单修图” 这类实用知识,会随手存到收藏夹,每周还会抽 1 小时把零散知识点整理成笔记,现在已经攒了厚厚一本,之前帮同学修图时,还从笔记里找到过调整…...