Linux编程——GCC的使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/baidu_28312631/article/details/47782205

    工欲善其事, 必先利其器。而gcc是Linux系统下最常见的编译器,本文学习gcc 编译器的使用。

    gcc 支持编译的一些源文件后缀名

   

    gcc 编译程序的流程

   

    Linux的可执行文件并没有像 Windows 那样有明显的.exe后缀名, 只需向其分配x(可执行)权限即可   sudo chmod +x excutefile

   作为Linux程序员,我们可以让gcc在编译的任何阶段结束,以便检查或使用该阶段的输出(这个很重要)


    用 gcc 编译一个经典 C 程序

    打开的vim环境中输入i进入编辑模式,输入以下代码:

// filename: hello.c
#include <stdio.h>
int main(int argc, char **argv)
{
    printf("Hello, Linux!");
}

/**
  *在Terminal打开后的界面中输入:$gcc hello.c -o hello
  *如果没有error,说明编译成功,将会在当前目录生成一个可执行文件 hello
  *继续输入:./hello 就会运行该程序,在bash上打印出 Hello, Linux!
 **/

    保存为hello.c文件

    gcc hello.c -o hello --- 第二个hello为文件名,名字任意取定(但是不能违反bash的规则)gcc hello.c -o, 但是作为一名优秀的程序员还是取个有意义的名字吧!

    从程序员的角度来看,一个简单的-o选项可以省略很多中间步骤一次性输出可执行文件; 但从编译器的角度来看,这条命令的背后是一系列的繁杂的工作。


    gcc 到底背着我们做了什么

    首先gcc会调用预处理程序cpp,由它负责展开在源程序中定义的宏(上例:#include <stdio.h>),向其中插入#include语句所包含的内容(原地展开stdio.h包含的代码)

    在终端中输入   

$ gcc -E hello.c -o hello.i

    还记得.i后缀吗?hello.i这是一个经过预处理器处理之后的C源文件,在bash试试这个命令,然后用vim打开它。

    gcc的-E参数可以让gcc在预处理结束后停止编译过程。

    第二步,将hello.i编译为目标代码,gcc默认将.i文件看成是预处理后的C语言源代码,因此它会直接跳过预处理,开始编译过程。   

$ gcc -c hello.i -o hello.o

    同样,用vim打开.o文件看看和.i .c文件有什么不同?应该是一片乱码,是吧?(它已经是二进制文件了)

    请记住,gcc预处理源文件的时候(第一步),不会进行语法错误的检查。

    语法检查会在第二步进行,比如花括号不匹配、行末尾没有分号、关键字错误......

    第三步,gcc连接器将目标文件链接为一个可执行文件,一个大致的编译流程结束 

gcc hello.o -o hello

    gcc 编译模块化的程序

    现在很多软件都是采用的模块化开发,通常一个程序都是有很多个源文件组成,相应的就形成了多个编译单元。gcc能够很好的处理这些编译单元,最终形成一个可执行程序

    代码编辑和输入参考上述使用vim程序输入,并在Terminal界面使用gcc进行编译。  

// hello.h
extern void print();

    这是个头文件,将会在hello_main.c中调用   

// hello_print.c
#include <stdio.h>

void print()
{
    printf ("Hello, Linux\n");
}
  
// hello_main.c
#include "hello.h"
void print();
int main(int argc, char **argv)
{
    print();
}

// Terminal中 $gcc hello_print.c hello_main.c -o hello 进行编译
// 将会打印出 Hello, Linux
    以上的gcc hello_print.c hello_main.c -o hello可以看成是执行了一下3条命令  
$ gcc -c hello_print.c -o hello_print.o
$ gcc -c hello_main.c -o hello_main.o
$ gcc hello_print.o hello_main.o -o hello



猜你喜欢

转载自blog.csdn.net/baidu_28312631/article/details/47782205