1.Linux 开发工具准备-GCC

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

参考:

第一个程序:

#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”的含义如下:
1arm 表示这是编译 arm 架构代码的编译器。
2none 表示厂商,一般半导体厂商会修改通用的交叉编译器,此处就是半导体厂商的名
字,ARM 自己做的交叉编译这里为 none,表示没有厂商。
3linux 表示运行在 linux 环境下。
4gnueabihf 表示嵌入式二进制接口,后面的 hf hard float 的缩写,也就是硬件浮点,说
明此交叉编译工具链支持硬件浮点。
5gcc 表示是 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
如果交叉编译器安装正确的话就会显示版本号,如图 所示:

 

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值