linux使用gcc的编译过程可以分为4步:
预处理
编译
汇编
链接
以hello.c为例:
#include<stdio.h>
int main()
{
printf("Hello - world!\n");
return 0;
}
(1)预处理
主要是处理 宏定义、内联函数等语意处理。可以使用:
gcc -E hello.c -o hello.i
-E 是预处理选项。
.i 表示已经预处理过的C原始程序。
(2)编译过程
主要检查代码的规范性、语法错误检查等,并把代码翻译成汇编代码。
gcc -S hello.i hello.s
-S 编译生成汇编选项
.s 代表生成的文件是汇编文件
(3)汇编过程
编译生成的.s文件,生成二进制的目标文件。
gcc -c hello.s hello.o
(4)链接阶段
链接到函数库。函数库分为静态库和动态库两种。静态库是指链接时,把库文件的代码全部加入到可执行的文件中。后缀为.a 。 动态库是在执行文件时,由运行时链接加载文件库,这样可以节省系统开销;后缀为.so。
gcc hello.o -o hello
-L 选项 可以指定链接库的文件夹
-static 选项 可以强制性的使用静态链接库
如:
gcc -L /usr/dev/lib -staitc -limysqlclient -test.o -o test
二、多个文件的编译过程
例如:
main.c文件中代码如下:
#include<stdio.h>
#include<stdlib.h>
void goodbye_world(void);
int main(void )
{
goodbye_world();
exit(0);
}
goodbye.c 文件中代码如下:
#include<stdio.h>
void goodbye_world(void)
{
printf("Goodbye - world!\n");
}
以上中的main.c文件的编译依赖于文件goodbye.c。
方法一:
可以先使用指令将上面的两个文件的编译成二进制文件(因为函数的链接发生在链接阶段):
gcc -c main.c -o main.o
gcc -c goodbye.c -o goodbye.o
生成main.o 和 goodbye.o。
gcc main.o goodbye.o -o goodbye
然后可以生成 goodbye可执行文件。
方法二:
由于c++编译器对编译做了处理,可以直接使用下面命令:
gcc main.c goodbye.c -o goodbye
即可生成goodbye可执行文件