Linux下gcc编译命令复习笔记
GCC
- 安装
sudo apt install gcc g++
- 查看版本
gcc/g++ -v/--version
- gcc常用参数选项
gcc编译选项 | 说明 |
---|---|
-E | 预处理指定的源文件,不进行编译 |
-S | 编译指定的源文件,但是不进行汇编 |
-c | 编译、汇编指定的源文件,但是不进行链接 |
-o [file1] [file2] / [file2] -o [file1] | 将文件 file2 编译成可执行文件 file1 |
-I directory | 指定 include 包含文件的搜索目录 |
-g | 在编译的时候,生成调试信息,该程序可以被调试器调试 |
-D | 在程序编译的时候,指定一个宏 |
-w | 不生成任何警告信息 |
-Wall | 生成所有警告信息 |
-On | n的取值范围:0~3。编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高 |
-l | 在程序编译的时候,指定使用的库 |
-L | 指定编译的时候,搜索的库的路径。 |
-fPIC/fpic | 生成与位置无关的代码 |
-shared | 生成共享目标文件,通常用在建立共享库时 |
-std | 指定C方言,如:-std=c99,gcc默认的方言是GNU C |
库的制作
静态库
- 命名规则
- Linux下文件名为libxxx.a ,lib为固定前缀,.a为固定后缀,xxx为自定义库名。
- 制作
- gcc获得.o文件
- 将.o文件打包,使用ar工具
ar rcs libxxx.a xxx.o xxx.o
r - 将文件插入备存文件中
c - 建立备存文件
s - 索引
- 使用
使用gcc中的-l和-L指定使用制作好的静态库。(注意头文件预编译要用-I)
示例编译命令:
gcc main.c -o main -I ./include -l calc -L ./lib
注意上面使用的静态库文件名为libcalc.a
动态库
- 命名规则
- Linux下文件名为libxxx.so ,lib为固定前缀,.a为固定后缀,xxx为自定义库名。在Linux下位可执行文件。
- 制作
- gcc得到.o文件,得到和位置无关的代码
gcc -c -fpic/-FPIC file1.c file2.c - gcc得到动态库
gcc -shared file1.o file2.o -o libcalc.so
- gcc得到.o文件,得到和位置无关的代码
- 使用
如果使用和静态库文件一样的编译命令:
gcc main.c -o main -I ./include -l calc -L ./lib
然后执行生成的main程序时会发现报错:
这是因为系统找不到我们制作的动态库的位置,只需要将动态库加入到可以被ld-linux.so能搜索的地方即可。它先后搜索elf文件的DT_RPATH段 ——> 环境变量LD_LIBRARY_PATH ——> /etc/ld.so.cache文件列表 ——> /lib/,/usr/lib目录找到库文件后将其载入内存。./main: error while loading shared libraries: libcalc.so: cannot open shared object file: No such file or directory
解决:- 添加环境变量
直接在命令行输入export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:<lib路径>
之后可以通过echo $LD_LIBRARY_PATH
查看环境变量是否修改成功,然后ldd main
查看能否找到库文件位置。
但是这种方法在关闭终端再重新打开后会失效,因为这是临时改变环境变量。
- 用户修改.bashrc
修改用户目录下的.bashrc
文件。在该文件最后一行加入刚才添加环境变量时的命令,保存退出后通过. ~/.bashrc
或source ~/.bashrc
使其生效。 - 系统修改profile
sudo修改/etc/profile
文件,在最后一行添加同样的命令后再保存退出后source。 - 有时可能需要重新打开终端使修改文件生效。
- 修改
/etc/ld.so.cache
文件
这个文件是二进制文件,需要通过修改/etc/ld.so.conf
文件间接配置。直接在文件内添加lib地址后保存退出然后运行sudo ldconfig
命令即可生效。 - 把库文件添加到库目录/lib/,/usr/lib下
不推荐,避免出现文件名冲突问题。
- 添加环境变量
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)