ARM_Linux中GCC编译器的使用

目录

前言:

GCC编译过程:

预处理:

编译阶段:

汇编:

链接阶段

GCC的常见使用


前言:

什么是GCC:

gcc的全称是GNU Compiler Collection,它是一个能够编译多种语言的编译器。最开始gcc是作为C语言的编译器(GNU C Compiler),现在除了c语言,还支持C++、java、Pascal等语言。gcc支持多种硬件平台。

特点:

  • gcc是一个可移植的编译器,支持多种硬件平台。例如ARM、X86等等。
  • gcc不仅是个本地编译器,它还能跨平台交叉编译。所谓的本地编译器,是指编译出来的程序只能够在本地环境进行运行。而gcc编译出来的程序能够在其他平台进行运行。例如嵌入式程序可在x86上编译,然后在arm上运行。
  • gcc有多种语言前端,用于解析不同的语言。
  • gcc是按模块化设计的,可以加入新语言和新CPU架构的支持。
  • gcc是自由软件。任何人都可以使用或更改这个软件。

        源文件需要经过编译才能够生成可执行文件,在Windows下进行开发的时候,只需要几个按键就可以编译,集成的开发环境(V Studio,keil,clion等)已经将各种编译工具封装好了,linux中虽然有一些集成好的编译器,但是对于嵌入式软件开发的时候,通常没有屏幕,只能通过指令进行程序的编写和调试。但是要编译出来的程序可以在ARM上运行,就必须使用交叉编译器xxx-gcc等。

GCC编译过程:

一个c/c++文件要经过四个过程才能变成可执行文件。

  • 预编译(Pre-Processing)
  • 编译(Compiling)
  • 汇编(Assembling)
  • 链接(Linking)

预处理:

预处理过程中,是对源代码文件中的包含(include)、预编译语句(以#开头的命令等)进行展开生成.i文件。

使用GCC的参数 “-E”,可以让编译器生成 .i 文件,参数 “-o”,可以指定输出文件的名字。

 # 预处理,可理解为把头文件的代码汇总成C代码,把*.c转换得到*.i文件
 gcc –E test1.c –o test1.i

预处理就是将要包含“#include”的文件插入到原文件中,将宏定义展开,根据条件编译命令选择要使用的代码,最后将这些东西输入到“.i”文件中等待进一步处理

编译阶段:

gcc调用不同语言的编译器,例如c语言调用编译器ccl。gcc实际上是个工具链,在编译程序的过程中调用不同的工具。而在编译阶段就是通过调用的工具将预处理后的.i文件编译成汇编语言,生成.s文件,就是把代码从C语言转为汇编语言。在这个过程,GCC会检查各个源文件的语法。

GCC可以使用-S选项,让编译程序生成汇编语言的代码文件(.s后缀)。

 # 编译,可理解为把C代码转换为汇编代码,把*.i转换得到*.s文件
 gcc –S hello.i –o hello.s
 ​
 # 也可以直接以C文件作为输入进行编译,与上面的命令是等价的
 gcc –S hello.c –o hello.s

了解过汇编语言的应该知道,对于不同的芯片会由不同的汇编指令集,这个是没法通用的。所以这是为什么要使用交叉编译器的一个主要原因。

汇编:

汇编阶段,gcc调用汇编器进行汇编。将汇编语言的.s文件经过汇编生成.o文件,每一个源文件都对应一个目标文件。把汇编语言转换成机器码。

 # 汇编,可理解为把汇编代码转换为机器码,把*.s转换得到*.o,即目标文件
 gcc –c hello.s –o hello.o
 ​
 # 也可以直接以C文件作为输入进行汇编,与上面的命令是等价的
 gcc –c hello.c –o hello.o

双击.o文件是打不开的,使用vim打开也是一堆乱码,这是因为Linux下生成的.o目标文件、.so动态库文件以及可执行文件都是elf格式的。可以使用“readelf”工具来查看内容。

从 readelf 的工具输出的信息,可以了解到目标文件包含ELF头、程序头、节等内容, 对于*.o目标文件或*.so库文件,编译器在链接阶段利用这些信息把多个文件组织起来。

链接阶段

最后将每个源文件对应的目标文件.o链接起来,就生成一个成执行文件了。

例如一个工程里包含了A和B两个代码文件,在链接阶段, 链接过程需要把A和B之间的函数调用关系理顺,也就是说要告诉A在哪里能够调用到fun函数, 建立映射关系,所以称之为链接。若链接过程中找不到fun函数的具体定义,则会链接报错。

虽然文章的test1例子中只有一个.c文件,但是调用了C标准代码库中的printf函数, 所以链接器会把它和printf函数链接起来,生成最终的可执行文件。

链接分为两种:

  • 动态链接:GCC编译时的默认选项。动态是指在应用程序运行时才去加载外部的代码库,不同的程序可以共用代码库。 所以动态链接生成的程序比较小,占用较少的内存。
  • 静态链接:链接时使用选项 “--static”,它在编译阶段就会把所有用到的库打包到自己的可执行程序中。 所以静态链接的优点是具有较好的兼容性,不依赖外部环境,但是生成的程序比较大。
 # 在hello.o所在的目录执行如下命令
 # 动态链接,生成名为hello的可执行文件
 ​
 gcc hello.o –o hello
 ​
 # 也可以直接使用C文件一步生成,与上面的命令等价
 gcc hello.c -o hello
 ​
 # 静态链接,使用--static参数,生成名为hello_static的可执行文件
 gcc hello.o –o hello_static --static
 ​
 # 也可以直接使用C文件一步生成,与上面的命令等价
 gcc hello.c -o hello_static --static

从图中可以看到,使用动态链接生成的hello程序才16.6KB, 而使用静态链接生成的hello_static程序则高达871.9KB。

在Ubuntu下,可以使用 ldd 工具查看动态文件的库依赖,尝试执行如下命令:

但是静态链接生成的可执行文件没有依赖外部库文件。

GCC的常见使用

//gcc使用示例
gcc hello.c // 输出一个名为 a.out的可执行程序,然后可以执行./a.out
gcc -o hello hello.c // 输出名为 hello的可执行程序,然后可以执行./hello
gcc -o hello hello.c -static // 静态链接
gcc -c -o hello.o hello.c // 先编译(不链接)
gcc -o hello hello.o // 再链接

执行“gcc -o test1 test1.c -v”的时候可以看到这写步骤

常用编译选项:

多文件编译

//一次性编译
gcc -o main  hello.c main.c //生成可执行文件main
//独立编译
gcc -Wall -c-o main.o main.c 
gcc -Wall -c -o hello.o hello.c
gcc -Wall -o main main.o hello.o

制作动态库:

静态库:

文章参考:

GCC基本使用 - 知乎 (zhihu.com)

Linux编译工具:gcc入门 - melonstreet - 博客园 (cnblogs.com)

  • 31
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: arm-linux-gcc是适用于ARM架构的交叉编译器,用于在x86架构的计算机上编译ARM架构的程序。它的下载和安装过程如下: 1. 首先,打开你的Linux系统终端或类似的控制台界面。 2. 使用以下命令安装相应的依赖软件包:sudo apt-get install build-essential 3. 接下来,通过以下命令下载arm-linux-gcc编译器:wget https://developer.arm.com/-/media/Files/downloads/gnu-a/10.3-2021.07/binrel/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf.tar.xz 4. 下载完成后,使用以下命令解压文件:tar xf gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf.tar.xz 5. 解压完成后,进入解压后的目录:cd gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf 6. 使用以下命令设置环境变量:export PATH=$PATH:/path/to/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/bin 7. 环境变量设置完成后,可以使用arm-linux-gcc编译器进行ARM架构的程序编译了。 需要注意的是,上述步骤下载的是特定版本的arm-linux-gcc编译器,如果需要其他版本或者更多的详细信息,可以访问ARM的官方网站或开发者社区进行下载和获取更多相关资料。 同时,也可以考虑使用其他交叉编译工具链,例如crosstool-ng或linaro等,这些工具链也提供了arm-linux-gcc编译器,可以根据自己的需求选择适合的编译器版本和工具链。 ### 回答2: arm-linux-gcc编译器是一种用于ARM架构的Linux操作系统的编译器ARM架构是一种广泛应用于嵌入式系统和移动设备的处理器架构。 要下载arm-linux-gcc编译器,可以按照以下步骤进行: 1. 打开互联网浏览器,并进入GCC官方网站。 2. 在GCC官方网站的下载页面上,选择合适的版本。由于arm-linux-gcc是用于ARM架构的编译器,所以应选择能够支持ARM架构的版本。 3. 确保系统满足下载该编译器所需的软件和硬件要求。通常要求包括操作系统版本和依赖的库文件。 4. 点击下载链接开始下载编译器。下载的文件通常为一个压缩包,其包含编译器的二进制文件和相关的文档。 5. 下载完成后,解压缩下载的压缩包。可以使用文件压缩解压工具,如WinRAR或7-Zip等。 6. 将解压后的编译器文件复制到系统的合适位置。根据个人需求,可以将文件复制到系统的全局路径下,以便在任何位置都可以使用,或者将其放置在项目目录,以便在特定项目使用。 7. 配置系统环境变量,以使系统可以找到编译器。在Linux系统,可以编辑.bashrc或.profile文件,并添加编译器的路径。 8. 保存文件并重新加载系统环境变量,以使更改生效。 下载并配置完成后,就可以使用arm-linux-gcc编译器来编译适用于ARM架构的Linux应用程序或驱动程序了。编译命令通常使用arm-linux-gccarm-linux-g++来调用编译器,并使用适当的编译选项和源代码文件来进行编译。在编译过程可以使用makefile等构建工具来简化编译流程。 ### 回答3: 要下载arm-linux-gcc编译器,首先需要找到可靠和安全的下载源。可以通过搜索引擎或者访问官方网站寻找合适的下载地址。一般来说,可以在GNU官方网站的GCC页面找到相关的下载链接。 一旦找到合适的下载链接,点击链接进入下载页面。在页面上,可能会有多个版本和不同的操作系统的选项。我们需要选择与我们的操作系统和目标架构相匹配的版本。 点击选择后,下载将自动开始。根据网络速度和文件大小,下载时间可能会有所不同。一旦下载完成,可以通过文件管理器或终端进入下载的目录,找到下载好的压缩文件。 一般来说,下载的文件是一个压缩文件,通常是tar.gz格式。我们需要解压缩文件以获得可执行文件和其他必要的资源。可以通过终端输入以下命令来解压缩文件: tar -xzvf <文件名.tar.gz> 解压缩完成后,可以在解压缩的目录找到可执行文件,例如arm-linux-gcc。我们可以通过终端输入以下命令来验证编译器是否成功下载: arm-linux-gcc -v 命令将显示编译器的版本信息,表明下载和安装成功。 值得注意的是,arm-linux-gcc编译器是针对ARM架构上的Linux系统而设计的,在其他架构和操作系统上可能无法正常工作。因此,在下载之前需要确保目标平台和操作系统与编译器的要求相匹配。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值