Unix like下gcc编译连接c/c++使用方法小结

1.在c/c++变成中,有源代码生成可执行文件需要四个阶段:

  • 预处理阶段(preprocess)
  • 编译阶段(compile)
  • 汇编阶段(assemble)
  • 连接阶段(link)

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





        

你可能感兴趣的:(Unix like下gcc编译连接c/c++使用方法小结)