转自:http://man.linuxde.net/gcc
gcc常用参数
选项
-o:指定生成的输出文件;
-E:仅执行编译预处理;
-S:将C代码转换为汇编代码;
-wall:显示警告信息;
-c:仅执行编译操作,不进行连接操作。
无选项编译链接
gcc test.c
将test.c预处理、汇编、编译并链接形成可执行文件。这里未指定输出文件,默认输出为a.out。
选项 -o
gcc test.c -o test
将test.c预处理、汇编、编译并链接形成可执行文件test。-o选项用来指定输出文件的文件名。
选项 -E
gcc -E test.c -o test.i
将test.c预处理输出test.i文件。
选项 -S
gcc -S test.i
将预处理输出文件test.i汇编成test.s文件。
选项 -c
gcc -c test.s
将汇编输出文件test.s编译输出test.o文件。
无选项链接
gcc test.o -o test
将编译输出文件test.o链接成最终可执行文件test。
选项 -O
gcc -O1 test.c -o test
使用编译优化级别1编译程序。级别为1~3,级别越大优化效果越好,但编译时间越长。
多个文件一起编译
gcc testfun.c test.c -o test
将testfun.c和test.c分别编译后链接成test可执行文件。
分别编译各个源文件,之后对编译后输出的目标文件链接。
gcc -c testfun.c #将testfun.c编译成testfun.o
gcc -c test.c #将test.c编译成test.o
gcc -o testfun.o test.o -o test #将testfun.o和test.o链接成test
以上两种方法相比较,第一中方法编译时需要所有文件重新编译,而第二种方法可以只重新编译修改的文件,未修改的文件不用重新编译。
选项 -I(INCLUDE)
gcc -I ./my_header_files test_code.c ... -o test_code
-I选项告诉gcc编译器还可以去哪里找头文件。编译器会 先检查-I选项中的目录,然后像往常一样检查所有标准目 录。
选项 -l(link) -L
gcc test_code.c -L ./my_lib -lhfsecurity -o test_code
-L选项告诉编译器去哪个目录查找存档
-lhfsecurity叫编译器去找一个叫libhfsecurity.a的存档
nm命令
nm命令被用于显示二进制目标文件的符号表,主要是函数和全局变量,目标文件主要是库文件和可执行文件(如.a,.o);
ar命令
ar -rcs libhfsecurity.a encrypt.o checksum.o
存档命令(ar)会在存档文件中保存一批目标文件
-fPIC
gcc -I/includes -fPIC -c hfcal.c -o hfcal.o
-fPIC。它告诉gcc你想创建位置无关代码
-shared
gcc -shared hfcal.o -o ./libs/libhfcal.so
-shared选项告诉gcc你想把.o目标文件转化为动态库
在Linux和大部分Unix中,编译器只会记录libhfcal.so库的文件名, 而不会包含路径名。也就是说如果不把hfcal库保存到标准目录(如 /usr/lib),程序就找不到它。为了解决这个问题,Linux会检查保 存在LDLIBRARYPATH变量中的附加目录。只要把库目录添加 到LDLIBRARYPATH中,并export①它
编译步骤
1. 预处理:修改代码。
编译器要做的第一件事就是修改代码。编译器需要用#include指令 添加相关头文件;编译器可能还需要跳过程序中的某些代码,或补充 一些代码。改完以后就可以随时编译源代码了。
2.编译:转换成汇编代码。
C语言看似底层,但计算机还是无法理解它。计算机只理解更低层 的机器代码指令。而生成机器代码的第一步就是把C语言源代码转 化为汇编语言代码,看起来像这样:
movq -24(%rbp), %rax
movzbl (%rax), %eax
movl %eax, %edx
3.汇编:生成目标代码。
编译器需要将这些符号代码汇编成机器代码或目标代码,即 CPU内部电路执行的二进制代码。
10010101 00100101 11010101 01011100
4.链接:放在一起。
一旦有了全部的目标代码,就需要像拼“七巧板”那样把它们拼在 一起,构成可执行程序。当某个目标代码的代码调用了另一个目标 代码的函数时,编译器会把它们连接在一起。同时,链接还会确保 程序能够调用库代码。最后,程序会写到一个可执行程序文件中, 文件格式视操作系统而定,操作系统会根据文件格式把程序加载到 存储器中运行。