参考:
第一个程序:
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("Hello World!\n");
}
新环境直接安装GCC包,提供了编译程序所需的所有软件包:
sudo apt-get install build-essential
等待安装完成,然后输入如下命令查看 GCC 编译器的版本号:
gcc -v
GCC编译服务器:
这说明这个 GCC 编译器是针
对 X86 架构的,因此只能编译在 X86 架构 CPU 上运行的程序。如果想要编译在 ARM 上运行
的程序就需要针对 ARM 的 GCC 编译器,也就是交叉编译器

X86运行:
gcc main.c -o test
./test运行
主要关注GDB调试:
在上一小节我们已经使用过 GCC 编译器来编译 C 文件了,我们使用到是 gcc 命令,gcc 命
令格式如下:
gcc [选项]
[文件名字]
主要选项如下:
-c:只编译不链接为可执行文件,编译器将输入的.c 文件编译为.o 的目标文件。
-o:<输出文件名>用来指定编译结束以后的输出文件名,如果使用这个选项的话 GCC 默
认编译出来的可执行文件名字为 a.out。
-g:添加调试信息,如果要使用调试工具(如 GDB)的话就必须加入此选项,此选项指示编
译的时候生成调试所需的符号信息。
-O:对程序进行优化编译,如果使用此选项的话整个源代码在编译、链接的的时候都会进
行优化,这样产生的可执行文件执行效率就高。
-O2:比-O 更幅度更大的优化,生成的可执行效率更高,但是整个编译过程会很慢。
GCC 编译器的编译流程是:预处理、编译、汇编和链接。
预处理就是展开所有的头文件、 替换程序中的宏、解析条件编译并添加到文件中(因此,头文件错误也会编译不过)。
编译是将经过预编译处理的代码编译成汇编 代码,也就是我们常说的程序编译。
汇编就是将汇编语言文件编译成二进制目标文件。
链接就 是将汇编出来的多个二进制目标文件链接在一起,形成最终的可执行文件,链接的时候还会涉及到静态库和动态库等问题
eg:多个.c 编译可执行文件
gcc -c main.c
gcc -c input.c
gcc -c calcu.c
gcc main.o input.o calcu.o -o main
上述命令前三行分别是将 main.c、input.c 和 calcu.c 编译成对应的.o 文件,所以使用了“-
c”选项,“-c”选项我们上面说了,是只编译不链接。最后一行命令是将编译出来的所有.o 文件
链接成可执行文件 main
简单的makefile:
main: main.o input.o calcu.o
gcc -o main main.o input.o calcu.o
main.o: main.c
gcc -c main.c
input.o: input.c
gcc -c input.c
calcu.o: calcu.c
gcc -c calcu.c
clean:
rm *.o
rm main
GCC交叉编译器:
这个 GCC 编译器是编译 ARM 架构代码的,也就是编译出来的可执行文件是在 ARM 芯
片上运行的。
交叉编译器中“交叉”的意思就是在一个架构上编译另外一个架构的代码,相当于两种架
构“交叉”起来了。
Target: arm

要使用刚刚安装的交叉编译器的时候使用的命令是“arm-none-linux-gnueabihf-gcc”,“arm-none-linux-gnueabihf-gcc”的含义如下:
1、arm 表示这是编译 arm 架构代码的编译器。
2、none 表示厂商,一般半导体厂商会修改通用的交叉编译器,此处就是半导体厂商的名
字,ARM 自己做的交叉编译这里为 none,表示没有厂商。
3、linux 表示运行在 linux 环境下。
4、gnueabihf 表示嵌入式二进制接口,后面的 hf 是 hard float 的缩写,也就是硬件浮点,说
明此交叉编译工具链支持硬件浮点。
5、gcc 表示是 gcc 工具
UbuntuX86 运行结果:cannot execute binary file: Exec format error
alientek@ubuntu18:~/test$ arm-none-linux-gnueabihf-gcc ./test.c -o test
alientek@ubuntu18:~/test$ ./test
bash: ./test: cannot execute binary file: Exec format error
alientek@ubuntu18:~/test$ gcc test.c -o testgcc.out
alientek@ubuntu18:~/test$ ./testgcc.out
test
alientek@ubuntu18:~/test$
参考原子的安装教程:
4.3.1 交叉编译器安装
ARM 裸机、Uboot 移植、Linux 移植这些都需要在 Ubuntu 下进行编译,编译就需要编译
器,我们在第三章“Linux C 编程入门”里面已经讲解了如何在 Liux 进行 C 语言开发,里面使
用 GCC 编译器进行代码编译,但是 Ubuntu 自带的 gcc 编译器是针对 X86 架构的!而我们现在
要编译的是 ARM 架构的代码,所以我们需要一个在 X86 架构的 PC 上运行,可以编译 ARM 架
构代码的 GCC 编译器,这个编译器就叫做交叉编译器,总结一下交叉编译器就是:
1、它肯定是一个 GCC 编译器。
2、这个 GCC 编译器是运行在 X86 架构的 PC 上的。
3、这个 GCC 编译器是编译 ARM 架构代码的,也就是编译出来的可执行文件是在 ARM 芯
片上运行的。
交叉编译器中“交叉”的意思就是在一个架构上编译另外一个架构的代码,相当于两种架
构“交叉”起来了。
交叉编译器有很多种,ST 也有推荐的通用交叉编译器,
首先是下载 ARM 官方出品的交叉编译器,图 4.3.1 中也给出了交叉编译器的下载链接:编
译器下载地址如下:https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-a/downloads,打开以后如图 4.3.2 所示:

在 Ubuntu 中创建目录:/usr/local/arm,命令如下:
sudo mkdir /usr/local/arm
创建完成以后将刚刚拷贝的交叉编译器复制到/usr/local/arm 这个目录中,
将交叉编译器复制到/usr/local/arm 中:
sudo cp gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf.tar.xz /usr/local/arm/ -f
拷贝完成以后在/usr/local/arm 目录中对交叉编译工具进行解压,
解压命令如下:
sudo tar -vxf gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf.tar.xz
等待解压完成,解压完成以后会生成一个名为“gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf”的文件夹,这个文件夹里面就是我们的交叉编译工具链。
修改环境变量,使用打开/etc/profile 文件,命令如下:
sudo vi /etc/profile
打开/etc/profile 以后,添加PATH如下所示内容:
export PATH=$PATH:/usr/local/arm/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/bin
添加完成以后的/etc/profile 如图 4.3.1.5 所示:

修改好以后就保存退出,重启 Ubuntu 系统,交叉编译工具链(编译器)就安装成功了。
4.3.2 安装相关库
在使用交叉编译器之前还需要安装一下其它的库,命令如下:
sudo apt-get update
//先更新,否则安装库可能会出错
sudo apt-get install lsb-core lib32stdc++6
//安装库
等待这些库安装完成。
4.3.3 交叉编译器验证
首先查看一下交叉编译工具的版本号,输入如下命令:
arm-none-linux-gnueabihf-gcc -v
如果交叉编译器安装正确的话就会显示版本号,如图 所示:



文章介绍了GCC编译器的使用,包括基本的编译选项、编译流程,以及如何在Ubuntu上安装和验证交叉编译器,特别是针对ARM架构的程序。通过示例展示了如何使用GDB进行调试,并提供了一个简单的makefile示例。此外,还详细说明了在Ubuntu系统中安装和配置ARM交叉编译器的步骤。
902

被折叠的 条评论
为什么被折叠?



