Linux常用基础(三)
1、gcc编译器
(1)简介
前期的GCC是GNU C Compiler,仅仅用于C语言的编译,经过多年的发展,现在的GCC为GNU Compiler Collection,并且目前支持多种编程语言的编译。
(2)gcc的编译过程
gcc的编译过程包括了四个过程,分别是预处理、编译、汇编和链接,如下所示:
1)预处理
主要是完成头文件的展开,c文件中宏的替换展开,去掉有关的注释。
命令:gcc -E myapp.c -o myapp.i
-E:生成预处理的文件
-o:生成目标文件
2)编译
预处理后的文件仍然是c文件,编译的过程是把c文件编译成汇编文件。
命令:gcc -S myapp.i -o myapp.s
-S:生成汇编文件
3)汇编
将汇编文件变成二进制文件。
命令:gcc -c myapp.s -o myapp.o
-c:编译子程序
4)链接
将相关的函数库链接到目标文件中去,最终生成可执行文件。
命令:gcc myapp.o -o myapp
(3)其它命令参数
1)查看gcc版本号:-v / --version
2)指定头文件目录:-I + 目录
3)编译时定义宏:-D
4)编译优化:-On (n=0-3:当n为0不优化,当n为3优化级别最高)
5)提示更多的警告信息:-Wall
6)包含调试信息:-g (GDB调试需要加此参数)
2、静态库
(1)命名规则
1)lib + 库的名字 + .a
2)例如:libmytest.a(库的名字为mytest)
(2)制作步骤
1)生成对应的.o文件,编译时添加-c参数
命令:gcc mytest.c -c
2)将生成的.o文件打包
命令:ar rcs + 静态库的名字(libmytest.a)+ 生成的所有.o文件
(3)发布和使用静态库
1)将打包好的lib和头文件发布出去,头文件提供API接口的相关信息
2)静态库使用方法
命令1:gcc main.c -I + 头文件路径lib/libmytest.a -o myapp
命令2:gcc main.c -I + 头文件 -L + 库的路径 -l + 库的名字 -o myapp
(4)优缺点
优点:
1)发布程序的时候,不需要提供相应的库
2)加载库的速度快
缺点:
1)库被打包到应用程序中,导致应用程序的体积很大
2)一旦库发生了变化,则应用程序需要重新编译
3、共享库(动态库)
(1)命名规则
1)lib + 库的名字 + .so
2)例如:libmytest.so
(2)制作步骤
1)生成与位置无关的代码(生成与位置无关的.o文件)
命令:gcc -fPIC -c *.c -I + 头文件路径
2)将.o打包成共享库(动态库)
命令:gcc -shared -o libmyapp.so *.o -I 头文件路径
(3)发布和使用共享库
发布:将.so文件和头文件进行发布
使用:
命令1:gcc main.c lib/libmyapp.so -o myapp -I 头文件路径
命令2:gcc main.c -I + 头文件路径 -L + 库的路径文件 -l + 库的名字 -o myapp
(4)程序执行时动态库无法被加载的问题解决
原因:环境变量中找不到动态库的路径,程序运行时链接不成功
解决:
1)将动态库拷贝到路径/lib中去(不允许使用)
2)将动态库路径添加到额外的链接环境变量LD_LIBRARY_PATH
命令:export LD_LIBRARY_PATH=./lib(动态库的路径)
3)将LD_LIBRARY_PATH永久改变
修改~/.bashrc配置文件,在文件最后export
4)通过修改动态连接器的配置文件
1)需要找到动态链接器的配置文件
命令:ls -l /etc/ld.so.conf
2)动态库的路径写入到配置文件中
命令:vim /etc/ld.so.conf
3)将动态库的路径添加到最后一行,然后保存退出vim
4)更新链接配置文件
命令:sudo ldconfig -v
(5)优缺点
优点:
1)应用程序的体积小
2)动态库更新,不一定需要重新编译应用程序
缺点:
1)发布程序的时候,需要发布动态库给用户
2)动态库并没有打包到应用程序中去,加载速度相对较慢
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App