gcc工作流程和编译原理
1. 预处理 gcc -E
2. 编译 gcc -S
3. 汇编 gcc -c
4. 链接 没参数
![](https://images2018.cnblogs.com/blog/1393152/201809/1393152-20180908103247607-1435843683.png)
gcc的参数
-I 指定头文件的路径
-o 指定生成的文件名
-D 在编译的时候给代码定义宏
-O 优化程序 后面跟 0 1 2 3 这是优化等级
-Wall 在程序编译的时候提示警告信息 比如定义了变量没有使用
-g 在程序中添加调试信息
-c 只编译子程序
-L 指定所用的库的目录
-l 指定库的名字 掐头去尾
静态库的制作
1>.命名规则
lib + 库的名字 + .a 例如 libmytest.a
2>.制作步骤
1). 生成对应的.o文件 --------- .c --->.o -c
2). 将生成的.o文件打包 ar rcs + 静态库的名字(libmytest.a)+ 生成的所有的.o
3>.发布和使用静态库:
1). 发布静态库
2). 头文件
![](https://images2018.cnblogs.com/blog/1393152/201809/1393152-20180908103444985-71417119.png)
4>.静态库的优缺点:(由于库在编译的时候直接被打包到应用程序中,所以会有对应的优缺点)
优点:
1).发布程序的时候,不需要提供对应的库
2).加载库的速度快
缺点:
1).库被打包到应用程序中,导致应用程序的体积很大
2).库一旦发生了改变,应用程序都需要重新编译
动态库(共享库)的制作和使用:
1>.命名规则:
1). lib + 名字 + .so
2>.制作步骤:
1). 生成与位置无关的代码(生成与位置无关的.o) gcc -fPIC -c *.c 多个参数-fPIC
2). 将.o打包成共享库(动态库)
![](https://images2018.cnblogs.com/blog/1393152/201809/1393152-20180908103848676-752910064.png)
3>.发布和使用共享库
4>. 解决程序执行时动态库无法被加载的问题:
1)放到系统的库目录中 --- 不允许使用
2) 临时测试 (终端关闭后就会失效)
环境变量: LD_LIBRAREY_PATH 将动态库的路径设置给该变量
将设置的值,导入到系统环境变量中: export LD_LIBRARY_PATH
3) 不常用的方法(永久设置):
在家目录的.bashrc文件中添加一句话: export LD_LIBRATRY_PATH=动态库目录的绝对路径
.bashrc修改完成,需要重启终端
4)
1. 需要找到动态连接器的配置文件 -- /etc/ld.so.conf
2. 动态库的路径写到配置文件中(绝对路径)
3. 更新 --- sudo ldconfig -v
5>. 动态库的优缺点
优点
1. 执行程序体积小
2. 动态库如果更新了 不需要重新编译程序 (函数接口不变)
缺点:
1.发布程序的时候,需要将动态库提供给用户
2.动态库没有被打包到应用程序中,所以调用起来相对较慢一些