(七)gdb调试 及静态库共享库

发布时间:2026/10/10 13:04:14

(七)gdb调试 及静态库共享库 一、gdb 常用调试命令前提编译程序必须加-g参数加入调试信息gcc main.c -g -o main否则 gdb 看不到源码。命令作用l/l 行号list显示源码l 10直接跳到第 10 行附近显示代码b 行号/b 函数名break设置断点b 20/b addinfo break查看所有断点信息显示断点编号delete 断点编号删除指定断点delete不加编号删除全部断点rrun从头运行程序遇到断点停下nnext单步执行不进入函数越过函数sstep单步执行进入调用的函数内部finish执行完当前函数跳出函数返回到调用处ccontinue继续运行直到下一个断点p 变量名print打印变量 / 表达式的值p abtbacktrace打印完整函数调用栈bt n只打印前 n 层调用栈qquit退出 gdb小提示gdb 敲回车会重复执行上一条命令。二、C 库基础头文件stdio.h——函数声明告诉编译器函数长什么样 库文件/usr/lib/libc.so.6——函数实现已经编译好的机器码集合。.h只放声明没有实现代码库文件存放真正编译完成的二进制实现代码库分为两大类静态库.a、共享 (动态) 库.so1、静态库.a本质多个.o目标文件归档打包而成使用ar工具制作。ar 参数c创建库文件r把目标文件添加进库vverbose显示操作过程生成静态库示例# 1.先把源码编译成目标文件 .o gcc -c add.c -o add.o gcc -c max.c -o max.o # 2.打包生成静态库 libfoo.a ar crv libfoo.a add.o max.o使用静态库链接生成可执行程序gcc main.o -L. -lfoo -o app-L.指定库搜索路径.代表当前目录-lfoo代表库名libfoo.a去掉lib前缀和.a后缀⚠️ 注意同一个目录下同时存在libfoo.a(静态) 和libfoo.so(动态)gcc优先链接动态库。静态库优缺点✅优点 链接阶段把库代码完整复制进可执行文件运行时不再依赖原库文件删掉libfoo.a程序照样跑。❌缺点可执行文件体积大每份程序都拷贝一份库代码内存浪费静态库更新后所有使用该库的程序必须重新编译链接才能用上新版本。2、共享库动态库.so运行的时候才加载库到内存多个进程可以共用内存里同一份库代码。编译生成动态库示例# -fPIC 生成位置无关代码动态库必备参数 gcc -c -fPIC add.c -o add.o gcc -c -fPIC max.c -o max.o # 生成共享库 libfoo.so gcc -shared add.o max.o -o libfoo.so链接使用动态库gcc main.o -L. -lfoo -o app动态库优缺点✅优点多个程序共享内存中一份库代码节省内存更新.so库文件只要接口不变程序不需要重新编译重启程序就使用新版库。❌缺点 运行依赖.so文件如果库丢失、版本不匹配程序直接运行失败。编译小技巧gcc 可以一步编译不需要手动生成.o# 直接用c源码链接静态库 gcc main.c -L. -lfoo -o appLD_LIBRARY_PATH 环境变量动态库运行时搜索路径。 gcc 编译时通过-L找库程序运行时不会读取 - L 参数操作系统会去系统库目录和LD_LIBRARY_PATH环境变量指定目录寻找.so。# 设置临时环境变量当前终端生效 export LD_LIBRARY_PATH.:$LD_LIBRARY_PATH ./app补充编译器默认自动链接 libc 标准库数学库libm需要手动加-lm。补充对比小结项目静态库.a动态共享库.so链接时机编译链接阶段拷贝代码编译只记录引用运行时加载运行依赖不依赖原库文件必须存在对应 so 文件内存占用每个程序自带一份库代码占用大多进程共享内存一份库库更新程序需要重新编译链接接口兼容时无需重编译制作工具argcc -shared
延伸阅读

更多相关文章

2026/10/10 13:02:26

鸿蒙跨设备剪贴板开发:从PasteData到分布式KV的完整实践

手机复制地址,平板那边马上能粘贴;电脑上复制一段代码,手机顺手就能贴进备忘录。这是我接触鸿蒙跨设备剪贴板之后,最直观也最上头的体验。刚开始我并不觉得这算什么大功能,直到自己动手写了一个跨设备剪贴板的小工具&a…

2026/10/10 13:02:26

epoll原理与高并发实战:从C10K到百万连接的I/O多路复用核心

1. 为什么“epoll”这个词总在深夜的服务器日志里闪现你有没有过这样的经历:凌晨两点,线上服务突然响应变慢,监控曲线像心电图一样剧烈抖动。运维同事甩来一条命令行截图——strace -p $(pgrep -f server) | grep epoll,后面跟着一…

2026/10/10 13:02:26

路由器故障排查全指南:从硬件到软故障的实战手册

简介:这份文档资料聚焦计算机网络中路由器的常见故障与处理思路,面向网络运维初学者、计算机专业学生以及需要排查家庭或小型办公网络问题的技术人员。内容从路由器的硬件组成讲起,涵盖处理器、DRAM、BootROM、NVRAM、Flash及系统软件等核心部…

2026/10/10 13:02:26

复现BOA改进三件套:Circle混沌初始化、非线性因子与正余弦融合

1. 为什么我决定复现这个“三件套”改进蝴蝶优化算法(BOA)在群体智能算法里不算冷门,它靠“气味浓度”来引导个体位置更新的机制很特别,代码写起来也比粒子群简单。但这两年我陆陆续续看了不少BOA改进文章,发现一个普遍…

2026/10/10 12:57:22

深度学习十年演进:从卷积网络到Transformer的工程实践复盘

2012年我刚入行的时候,谁要是在组会上说“咱们把图像识别的特征工程全扔掉,让网络自己学”,大概率会被当成刚看完科幻电影的热血青年。但十年之后,当年那套“让网络自己学”的思路已经把整个行业从头到脚换了一遍。我也是在那几年…

2026/10/10 7:31:36

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/9 20:15:56

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/8 6:05:44

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 0:04:53

从逻辑门到计算机:数字电路核心原理与全加器搭建实战

如果你拆过一台旧电脑的主板,盯着那些黑乎乎的小芯片看上一会儿,可能会冒出同一个疑问:这堆引脚密集的元件,到底是怎么“变”出那么复杂的应用的?答案并不在某个神秘的部件里,而是在所有芯片内部都在反复使…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑