GCC编译过程及链接库
Contents
编译过程
GCC的编译过程是分为四个阶段进行的,即预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编 (Assembly)和连接(Linking)。
gcc -E test.c -o test.i #预处理,将头文件等整理到相应程序中
gcc -S test.i -o test.s #编译生成汇编代码
gcc -c test.s -o test.o #汇编代码生成目标文件
gcc test.o -o test #目标文件之间相互连接生成可执行文件
通常编译过程,我们只进行编译——gcc -c *.c
和链接——gcc -o *.o main
操作,其他中间过程由编译器自身处理。
编译选项
-Idir
指定头文件的路径
-Ldir
指定库文件的路径
-llib
指定库文件的名称
-w
关闭所有警告信息
-Wall
打开gcc所提供的所有有用警告信息
-Werror
gcc会在所有产生警告的地方停止编译
-On
编译器的优化选项,O1/O2/O3,优化等级不断提升,编译困难也更高,建议先编译通过待发布时再优化
静、动态链接库
静态库,链接时搜索路径顺序
- GCC命令行中的参数
-L
的目录
LIBRARY_PATH
指定的静态库搜索路径
- 默认目录
/lib
、/usr/lib
、/usr/local/lib
动态库,链接时搜索路径顺序
- GCC命令行中的参数
-L
的目录
LD_LIBRARY_PATH
指定的动态库搜索路径
- 配置文件
/etc/ld.so.conf
中指定的动态库搜索路径
- 默认目录
/lib
、/usr/lib
静态库与动态库的优缺点
静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库,因此程序运行过程不需要再进行任何链接操作而提高程序效率,但也会因为静态库被写入到执行程序中增加磁盘占用,另外如果多个程序同时运行静态库也会增加内存占用。
动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在,但与静态库相比动态库节省内存、磁盘空间。
Author F. Cheng
LastMod 2015-10-21