1. gcc工作流程
1.1 预处理--E
- 宏替换
- 头文件展开
- 注释去掉
- xxx.c-->xxx.i(c文件)
1.2 编译--S
- xxx.i-->xxx.s(汇编文件)
1.3 汇编--c
- xxx.s-->xxx.o(二进制文件)
1.4 链接
- -o指定生成的文件名,如:gcc hello.o -o hello,(默认文件名:a.out)
- xxx.o-->xxx(可执行)
![](https://img.haomeiwen.com/i13927970/6b4c9987f552feb3.png)
2. gcc常用参数
-
-v/--version:查看gcc版本信息
-
-I:指定头文件的路径
例如:gcc sum.c -I ./include/ -o sum(sum.c中包含的头文件在./include/目录下) -
-c:将汇编文件生成二进制文件,得到一个.o文件
-
-o:指定生成的文件名字
-
-g:gdb调试的时候需要加
-
-D:在编译的时候指定一个宏
- 使用场景:测试程序的时候用
-
-Wall:添加警告信息
-
-On:优化代码,n是优化级别:1,2,3
3. 静态库和动态库的制作和使用
1. 库是什么
- 二进制文件
- 将源代码->二进制格式的源代码
- 加密
2. 库制作出来之后,如何给客户使用?
- 头文件
- 制作出的库
3. 静态库的制作和使用
- 命名规则:libmycalc.a
- lib
- mycalc:库的名字
- .a
- 制作步骤:
- 原材料:源代码.c .cpp
- 将.c文件生成.o
例如:gcc a.c b.c -c - 将.o文件打包
例:ar rcs 静态库的名字 原材料( arc rcs libmycalc.a a.o b.o)
- 库的使用:
-
- -L:指定库的路径
- -l:指定库的名字取得lib和.a
-
4. 动态库的制作和使用
- 命名规则:libxxx.so
- 制作步骤:
- 原材料:源代码.c .cpp
- 将.c文件生成.o
例如:gcc a.c b.c -c -fpic
- 将.o文件打包
例:gcc -shared a.o b.o -o libxxx.so - 库的使用:
-
运行./app2失败:
运行动态库加载失败解决:
-
-
对于elf格式的可执行程序,是有ld-linux.so来完成的
它先后搜索elf文件的DT_RPATH段——环境变量LD_LIBRARY_PATH——/etc/ld.so.cache文件列表——/lib/,/usr/lib/目录找到库文件后将其载入内存 -
如何让系统找到共享库
-
拷贝自己制作的共享库到/lib或者/usr/lib
-
临时设置:
- export LD_LIBRARY_PATH=库路径(例:./lib)
- 最好:export LD_LIBRARY_PATH=库路径(例:./lib):$LD_LIBRARY_PATH
-
-
-
-
永久设置
- 用户级别:~/.bashrc
配置完成后:重启终端/source ~/.bashrc - 系统级别:/etc/profile
配置完成后:source /etc/profile
- 用户级别:~/.bashrc
-
/etc/ld.so.cache文件列表
- 找到/etc/ld.so.conf
- 把动态库的绝对路径添加到文件中
- 执行一个命令:sudo ldconfig -v
-
知识点扩展:
- dlopen,dlclose,dlsym
网友评论