c语言一:c语言的编译过程

一. 预处理

预处理的作用:

1. 处理头文件包含
2. 处理宏替换
3. 处理条件编译
4. 删除注释
5. 不做语法检查

操作:

gcc -E hello.c -o hello.i

二. 编译

编译的作用:

1. 将预处理后的c代码文件 编译成 汇编语言文件
2. 做语法检查

操作:

gcc -S hello.i -o hello.s

三. 汇编

汇编的作用:将汇编语言文件编译成二进制文件
操作:

gcc -c hello.s -o hello.o

四. 链接

链接的作用:将众多二进制文件++启动代码 生成 二进制可执行文件(windows下的exe;linux下的elf);
链接器的工作原理:
1. 链接是基于对象文件和对象文件库构建可执行文件的过程;
2. 对象文件中包含符号,符号表示源程序中定义的函数或变量;
3. 链接的基本思想是将每个符号与其对应的定义关联起来,也成为符号解析。

操作:

gcc hello.o -o hello_elf

如果链接时需要第三方动态库,而这个动态库又不在系统默认目录中,需要用参数-L指明去哪里找第三方动态库

gcc -L ./lib -o app main.o -lmylib

五. 查看可执行文件依赖哪些动态链接库

[root@DTOS test]# ldd a
	linux-vdso.so.1 =>  (0x00007ffe17bdc000)
	libuwamysql.so => /usr/local//lib/libuwamysql.so (0x00007f9f157bc000)
	libmysqlclient.so.20 => /usr/lib64/mysql/libmysqlclient.so.20 (0x00007f9f14fa5000)
	libc.so.6 => /lib64/libc.so.6 (0x00007f9f14bd7000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f9f149bb000)
	libdl.so.2 => /lib64/libdl.so.2 (0x00007f9f147b7000)
	librt.so.1 => /lib64/librt.so.1 (0x00007f9f145af000)
	libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f9f142a7000)
	libm.so.6 => /lib64/libm.so.6 (0x00007f9f13fa5000)
	libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f9f13d8f000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f9f159c0000)

六. Linux动态库的生成

gcc file.c -fPIC -shared -o libmylib.so
-fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的,所有动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。
-shared:指明编译成动态库

七. 可执行程序需要的第三方库如果不在系统标准目录中,需要修改环境变量LD_LIBRARY_PATH将第三方库所在目录加入其中

export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值