gcc基础

gcc工作流程

预编译 ->编译->汇编->链接


流程介绍

预编译

阶段操作

  1. 展开头文件
  2. 替换宏
  3. 消除注释

结果:生成.i结尾的预处理文件


编译

阶段操作

源代码翻译成汇编代码

结果:生成.s结尾的汇编文件


汇编

阶段操作

将汇编文件翻译为二进制文件

结果:生成.c结尾的二进制文件


链接

阶段操作

将多个二进制文件与所需要的库连接起来

结果:生成可执行的二进制文件


gcc工作流程动图展示

在这里插入图片描述

可以通过一条语句直接生成二进制可执行文件

gcc xxx.c -o xxx //自动完成 预编译->编译->汇编->链接
gcc xxx.c //生成a.out 因为没有指定生成名

gcc常用参数

参数作用呢
-E预处理指定文件,但不编译
-S编译指定源文件但不汇编
-c编译汇编指定源文件,但不链接
-o [file1] [file2] 或[file2] -o [file1]将file2编译成file1 (-o后跟生成文件)
-I(大写i)指定include包含文件的搜索目录,使用场景:include包含的文件不在当前目录下,需要指定搜索目录
-g生成调试信息使用场景:gdb调试
-D编译的时候指定一个使用场景: 控制日志输出
-w不生成任何警告信息
-Wall生成所有警告信息
-Onn取值为1-3,表示编译器的优化级别,0表示没有优化,3优化级别最高
-l编译时指定使用库, 使用场景:使用静态库/动态库
-L指定搜索库路径
-fPIC/fpic生成与位置无关的代码
-shared生成共享目标文件
-std指定C标准 ,windows一般默认为c99,linux默认GNU C,使用方法 -std=c99

动态库和静态库

本质:一个程序

作用:

  1. 便于传输
  2. 保护知识产权

静态库

Linux静态库命名格式:libxxx.a
Windows静态库命名格式:libxxx.lib

静态库生成方式:

  1. 将源文件转化为.o文件(汇编文件
gcc -c xxx.c ....
  1. 创建静态库
ar rcs 静态库的名字(libxxx.a) 原材料(.o文件)
  1. 发布
    头文件 (告诉用户如何使用) +静态库 (底层实现)

使用语法

	gcc xxx.c -o xxx -L [库所在目录] -l [库名字(掐头去尾)]
//掐头去尾指 若静态库名字为libxxx.a,则-l xxx即可

动态库

动态库特点:

  1. 动态库有执行权限
  2. 动态库地址不定,加载到动态库加载区,使用的是相对地址

Linux静态库命名格式:libxxx.so
Windows静态库命名格式:libxxx.dll

动态库的生成方式

  1. 将源文件转化为.o文件(汇编文件
gcc -c -fpic xxx.c...
  1. 生成动态库
gcc -shared [汇编文件] -o [动态库名]
  1. 发布
    头文件 (告诉用户如何使用) +静态库 (底层实现)

使用语法

	gcc xxx.c  -L [库所在目录] -l [库名字(掐头去尾)] -o xxx
//掐头去尾指 若静态库名字为libxxx.so,则-l xxx即可

动态库最终生成的可执行程序中不包含动态库的代码,使用的时候才加载,所以动态连接器会有一个搜索库的操作。
查看程序是否能搜索到动态库

ldd xxx

当动态连接器搜索不到动态库时有如下解决方法

动态链接器搜索次序:

  1. LD_LIBRARY_PATH环境变量
  2. /etc/ld.so.cache
  3. /lib/usr/lib

解决方法1

LD_LIBRARY_PATH=[动态库绝对路径]:$LD_LIBRARY_PATH

但是这种是临时的,不长久

长久的方法:
修改 用户级别 ~./bashrc 或者 系统级别的配置文件 /etc/profile

在配置文件后添加

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:[动态库绝对路径]
.~/.bashrc //让当前终端重新加载配置信息

解决方法2

通过修改ld.so.conf来间接修改 /etc/ld.so.cache

sudo vim /etc/ld.so.conf	
#添加动态库的绝对路径
sudo ldconfig #ld.so.conf的数据更新到 /etc/ld.so.cache中

解决方法3

将动态库的软连接放到 /lib 目录或/usr/lib目录

#直接拷贝
sudo cp /xxx/xxx/libxxx.so /usr/lib

#创建软连接(推荐)
sudo ln -s /xxx/xxx/libxxx.so /usr/lib/libxxx.so

动态库与静态库总结

静态库

优点缺点
打包加载速度快相同库文件可能在内存中被加载多次,浪费资源
发布程序无需提供库文件程序迭代麻烦

动态库

优点缺点
资源共享加载速度慢
程序迭代升级简单发布程序需要提供依赖的库
控制何时加载动态库

静态库使用场景:
源文件量小

动态库使用场景
源文件量大

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值