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