GCC编译命令
参考链接:http://c.biancheng.net/view/7930.html(力荐!!)
无论是 C 还是 C++ 程序,其从源代码转变为可执行代码的过程,具体可分为 4 个过程,分别为预处理(Preprocessing)、编译(Compilation)、汇编(Assembly)和链接(Linking)。默认情况下,gcc 指令会一气呵成,直接将源代码历经这 4 个过程转变为可执行代码,且不会保留各个阶段产生的中间文件
test.c文件
#include <stdio.h>
void main() {
printf("Hello World!");
}
GCC 一步完成
gcc test.c
GCC 编译器会在当前目录下生成一个名为 a.exe 的可执行文件
GCC -E:预处理
gcc -E test.c
结果疯狂刷屏···
默认情况下 gcc -E 指令只会将预处理操作的结果输出到屏幕上,并不会自动保存到某个文件。因此该指令往往会和 -o 选项连用,将结果导入到指令的文件中。
gcc -E test.c -o test.i
生成一个预处理文件
另外,我们可以为 gcc 指令再添加一个 -C 选项,阻止GCC删除源文件和头文件中的注释:
gcc -E -C test.c -o test.i
GCC -S 编译非汇编文件
gcc -S test.i
生成test.s汇编文件
也可通过添加 -o 选项,令 GCC 编译器将编译结果保存在我们指定的文件中。
需要注意的是,gcc -S 指令操作的文件并非必须是经过预处理后得到的 .i 文件,-S 选项的功能是令 GCC 编译器将指定文件处理至编译阶段结束。这也就意味着,gcc -S 指令可以操作预处理后的 .i 文件,也可以操作源代码文件:
如果操作对象为 .i 文件,则 GCC 编译器只需编译此文件;
如果操作对象为 .c 或者 .cpp 源代码文件,则 GCC 编译器会对其进行预处理和编译这 2 步操作。
在此基础上,如果想提高文件内汇编代码的可读性,可以借助 -fverbose-asm 选项,GCC 编译器会自行为汇编代码添加必要的注释,例如:
gcc -S test.c -fverbose-asm
GCC -c选项:生成目标文件
gcc -c test.s
生成同名但后缀为.o的文件,这就是经过汇编操作得到的目标文件。
当然如果必要的话,还可以为 gcc -c 指令在添加一个 -o 选项,用于将汇编操作的结果输入到指定文件中
需要强调的一点是,和 gcc -S 类似,gcc -c 选项并非只能用于加工 .s 文件。事实上,-c 选项只是令 GCC 编译器将指定文件加工至汇编阶段,但不执行链接操作。这也就意味着:
如果指定文件为源程序文件(例如 demo.c),则 gcc -c 指令会对 demo.c 文件执行预处理、编译以及汇编这 3 步操作;
如果指定文件为刚刚经过预处理后的文件(例如 demo.i),则 gcc -c 指令对 demo.i 文件执行编译和汇编这 2 步操作;
如果指定文件为刚刚经过编译后的文件(例如 demo.s),则 gcc -c 指令只对 demo.s 文件执行汇编这 1 步操作。
得到生成目标文件之后,接下来就可以直接使用 gcc 指令继续执行链接操作
gcc test.o
默认生成a.exe可执行文件
GCC -o选项:指定输出文件
GCC -L选项:手动添加链接库
链接器把多个二进制的目标文件(object file)链接成一个单独的可执行文件。
GCC 的-l选项(小写的 L)可以让我们手动添加链接库。
链接其它目录中的库
通常,GCC 会自动在标准库目录中搜索文件,如果想链接其它目录中的库,就得特别指明。有三种方式可以链接在 GCC 搜索路径以外的链接库
- 把链接库作为一般的目标文件,为 GCC 指定该链接库的完整路径与文件名。
- 使用-L选项,为 GCC 增加另一个搜索链接库的目录:
- 把包括所需链接库的目录加到环境变量 LIBRARYPATH 中。