1.在c/c++变成中,有源代码生成可执行文件需要四个阶段:
2.gcc的用法小结
gcc是由GNU计划维护的,是一个在Unix like系统下进行编译和连接的工具。
假设源文件是main.c,
(1)预处理阶段
gcc -E main.c -o main.i #产出的“预处理源代码”写入到main.i文件中(2)编译阶段
gcc -S main.i -o main.s #输入文件是“预处理源代码” gcc -S main.c -o main.s #输入文件是源代码(3)汇编阶段
gcc -c main.c -o main.o #输入文件是“源代码” gcc -c main.i -o main.o #输入文件是“预处理源代码” gcc -c main.s -o main.o #输入文件是“汇编码”(4)链接阶段
gcc main.c -o main #输入文件是“源代码” gcc main.i -o main #输入文件是“预处理源代码” gcc main.s -o main #输入文件是“汇编码” gcc main.o -o main #输入文件是“链接码”
备注,如上几个过程,如果没有加上-o指定输出文件的文件名,那么会默认的输出的控制台或者产出的文件使用一个默认的文件名。
3.gcc的几个重要选项的说明
(1)-o file ——将gcc命令处理的结果输出到文件中
gcc -o file file_1.o file_2.o 命令执行后,将目标文件file_1.o和file_2.o链接生成可执行文件file
(2)-lm ——表示在编译自己的源文件的时候,将libm.so(应该相当于windows下的静态链接库或动态链接库)这个函数库加入进来。可以将-l看成是选项,表示引入某个函数库的意思。而m表示使用libm.so这个函数库,只是把lib以及.so省略了。
(3)-L/path ——和上面的-lm参数是有关联的,表示上面要引入的函数库在os中的路径,一条编译命令里面可以有多个-L/path参数。
(4)-I/path ——表示源码中include预处理中,include进来的文件在os中的路径,一条编译命令里面可以有多个-I/path参数。
PS.如果在使用gcc命令后直接跟着源文件,没有-o,那么表示将源码编译链接并直接生成了可执行文件(a.out)
4.举一个简单的例子来说明
/* 文件名helloworld.c */ #include<stdio.h> int main(){ printf("Hello World!!!\n"); func_1(); float value = sin(3.14/2); printf("value = %f\n",value); return 0; }
/* 文件名func_1.c */ #include<stdio.h> void func_1(){ printf("invoke func_1()...\n"); }
说明,这个例子中包括了主程序与子程序的调用编译的场景,也包括调用外部函数库的场景。
编译和连接:
gcc helloworld.c func_1.c -lm -L/lib -L/usr/lib -I/usr/include执行和结果:
./a.out