阅读本文需要3分钟


常用编译选项



  • -E:预处理,快速定位某个宏可以使用"-E -dM";
  • -S:编译后即停止,不进行汇编,对于每个输入的非汇编文件,输出汇编语言文件
  • -c:预处理,编译,汇编,但是不链接,编译器根据源文件生成obj文件;
  • -o:指定输出文件;
  • -I:指定头文件目录;
  • -L:指定链接时头文件目录;
  • -l:指定链接其中的库文件;

编译多个文件

一起编译链接

gcc -o test a.c b.c

分开编译链接

gcc -c -o a.o a.c
gcc -c -o b.o b.c
gcc -o test a.o b.o

制作和使用动态库

制作

gcc -c -o a.o a.c
gcc -c -o sub.o sub.c
gcc -shared -o libsub.so sub.o //可以使用多个.o文件生成动态库
gcc -o test a.o -lsub -L/libsub.so所在目录

运行


  • 把libsub.so复制到板子上的/ lib目录下
  • 如果放在其他目录,需要设置环境变量(export LD ​LIBRARY​ PATH = / path)
  • ./test

制作和使用静态库

gcc -c -o a.o a.c
gcc -c -o sub.o sub.cL
ar crs -o libsub.a sub.o //可以使用多个.o文件生成动态库
gcc -o test a.o -lsub -L/libsub.a所在目录

运行


  • 不需要复制libsub.a
  • ./test

其他选项


  • -Wall:警告选项。输出所有警告信息
  • -g:调试选项。以操作系统的本地格式(stabs,COFF,XOFF或DWARF)产生调试信息,GDB能够使用这些调试信息
  • -O或-O1:优化选项。对于大函数,优化编译过程会占用稍微多的时间和相当大的内存。不使用优化选项的目的是为了减少编译的体积,使编译结果能够调试,语句独立。
  • -O2:多优化了一些。除了涉及空间和速度交换的优化选项,执行了几乎所有的优化工作。和-O或O1比较,即增加了编译时间,也提高了生成代码的运行时间
  • -O3:优化的更多。除了打开O2的一切,还打开了-finline-functions选项
  • -O0:不优化
  • -nostartfiles:不链接系统标准启动文件
  • -nostdlib:不链接系统标准启动文件和标准库文件
  • -static:仅使用静态库链接
  • -share:生成一个共享obj文件