编译过程

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

静态库与动态库的优缺点

静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库,因此程序运行过程不需要再进行任何链接操作而提高程序效率,但也会因为静态库被写入到执行程序中增加磁盘占用,另外如果多个程序同时运行静态库也会增加内存占用。

动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在,但与静态库相比动态库节省内存、磁盘空间。