编译工具链还傻傻分不清吗?

发布于 2021-09-07 07:46

1.为什么需要“选择”编译工具链?

工具链的作用之一是将.c .h等等源文件翻译成机器指令,机器指令与硬件架构、操作系统密切相关,所以选择一个与目标平台相符的编译工具链就很重要。

当我们在为某个平台编译u-boot、内核、驱动、应用等等时,做的第一件事情就是配置一个适合这个平台的编译工具链。

例如:

将工具链所在路径加入PATH环境变量

ARCH=arm

CROSS_COMPILE=arm-linux-gnueab

选择什么样的工具链取决于你即将编译的程序是运行在哪种平台上(操作系统+CPU架构=平台),例如我需要为一个运行着linux操作系统的s5pv210编译一个打印“hello wordl”的程序。

这时可以根据上述信息选择编译工具链,s5pv210对应arm 32位架构,linux对应到运行环境为linux,即可选用arm-none-linux-gnueabi工具链。




2.工具链的命名规则

[arch]- [vendor]-[os]-[bi(eabi/abi)]-[gxx]

[]中的内容表示可选项

arch:代表架构,如arm、mips等等

vendor:代表提供工具链的厂商

os:表示目标操作系统,如果给裸机可选择linux加上-static静态链接,不使用动态库,将要用到的库全部编译到可执行文件中,或者选用一个none的也可以,这时很灵活的,可以自己分辨

bi:代表二进制程序接口,例如针对嵌入式平台选择eabi

gxx:可选择使用gcc、g++、ld等等工具ABI与EABI的区别

这部分定义了

数据类型在内存中的布局方式(数据大小/对齐方式)

嵌套函数调用的工作方式

程序启动/初始化如何工作

ABI全称Application Binary Interface 应用程序二进制接口,可理解为应用程序和操作系统之间的接口,适用于x86/x64。

EABI全程Embedded Binary Interface 嵌入式二进制接口,适用于嵌入式的二进制程序接口。实例

arm-linux-gnueabi-gcc:该工具链用于arm架构,适用于裸机系统,嵌入式平台,用于编译c语言文件。不适用linux系统(不支持编译使用了linux相关c库API的程序,例如含有fork函数)。

arm-none-linux-gnueabi-gcc:该工具链用于arm架构,适用于Linux系统,嵌入式平台,用于编译c语言文件。可编译u-boot、linux内核、适用于arm的linux程序等

关于某个工具链的详细特性可以查阅该工具链的参考手册。




朱老师IT充电站
朱老师IT充电站由朱有鹏老师创办,围绕“IT人的全方位成长”这个主题,从技术、思想、知识、资讯、经验等多维度多视角进行选题,力求给每个IT人全方位的成长与提升。
156篇原创内容
设置星标 * 不怕错过

每天了解一些新技术,每天辩一些真道理!

转发

收藏

本文来自网络或网友投稿,如有侵犯您的权益,请发邮件至:aisoutu@outlook.com 我们将第一时间删除。

相关素材