《嵌入式 Linux C 语言应用程序设计(修订版)》——2.3 嵌入式Linux编译器GCC的使用...

    xiaoxiao2024-03-19  119

    本节书摘来自异步社区《嵌入式 Linux C 语言应用程序设计(修订版)》一书中的第2章,第2.3节,作者 华清远见嵌入式培训中心,孙琼,更多章节内容可以访问云栖社区“异步社区”公众号查看。

    2.3 嵌入式Linux编译器GCC的使用

    2.3.1 GCC概述

    作为自由软件的旗舰项目,Richard Stallman在十多年前刚开始写作GCC的时候,还只是仅仅把它当作一个C程序语言的编译器,GCC的意思也只是GNU C Compiler而已。

    经过了这么多年的发展,GCC已经不仅仅能支持C语言,它现在还支持Ada语言、C++语言、Java语言、Objective C语言、PASCAL语言、COBOL语言,并支持函数式编程和逻辑编程的Mercury语言等。而GCC也不再单只GNU C语言编译器的意思了,而是变成了GNU编译器家族了。

    正如前文中所述,GCC的编译流程分为了4个步骤,分别为。

    预处理(Pre-Processing)。编译(Compiling)。汇编(Assembling)。链接(Linking)。

    编译器通过程序的扩展名可分辨编写原始程序码所用的语言,由于不同的程序所需要执行编译的步骤是不同的,因此GCC根据不同的后缀名对它们进行分别处理,表2.6指出了不同后缀名的处理方式。

    2.3.2 GCC编译流程分析

    GCC使用的基本语法为:

    gcc [option | filename]

    这里的option是GCC使用时的一些选项,通过指定不同的选项GCC可以实现其强大的功能。这里的filename则是GCC要编译的文件,GCC会根据用户所指定的编译选项以及所识别的文件后缀名来对编译文件进行相应的处理。

    本节从编译流程的角度讲解GCC的常见使用方法。

    首先,这里有一段简单的C语言程序,该程序由两个文件组成,其中“hello.h”为头文件,在“hello.c”中包含了“hello.h”,其源文件如下所示。

    /*hello.h*/ #ifndef _HELLO_H_ #define _HELLO_H_ typedef unsigned long val32_t; #endif /*hello.c*/ #include <stdio.h> #include <stdlib.h> #include "hello.h" int main() { val32_t i = 5; printf("hello, embedded world %d\n",i); }

    1.预处理阶段

    GCC的选项“-E”可以使编译器在预处理结束时就停止编译,选项“-o”是指定GCC输出的结果,其命令格式为如下所示。

    gcc –E –o [目标文件] [编译文件]

    表2.6指出后缀名为“.i”的文件是经过预处理的C原始程序。要注意,“hello.h”文件是不能进行编译的,因此,使编译器在预处理后停止的命令如下所示。

    [root@localhost gcc]# gcc –E –o hello.i hello.c

    在此处,选项‘-o’是指目标文件,由2.6表可知,‘.i’文件为已经过预处理的C原始程序。以下列出了hello.i文件的部分内容。

    # 2 "hello.c" 2 # 1 "hello.h" 1 typedef unsigned long val32_t; # 3 "hello.c" 2 int main() { val32_t i = 5; printf("hello, embedded world %d\n",i); }

    由此可见,GCC确实进行了预处理,它把“hello.h”的内容插入到hello.i文件中了。

    2.编译阶段

    编译器在预处理结束之后,GCC首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,就开始把代码翻译成汇编语言,GCC的选项“-S”能使编译器在进行完汇编之前就停止。由表2.6可知,“.s”是汇编语言原始程序,因此,此处的目标文件就可设为“.s”类型。

    [root@localhost gcc]# gcc –S –o hello.s hello.i

    以下列出了hello.s的内容,可见GCC已经将其转化为汇编了,感兴趣的读者可以分析一下这一行简单的C语言小程序用汇编代码是如何实现的。

    .file "hello.c" .section .rodata .LC0: .string "hello, embedded world %d\n" .text .globl main .type main, @function main: pushl
    转载请注明原文地址: https://yun.8miu.com/read-122495.html
    最新回复(0)