Advertisement

2024年C C++最新交叉编译详解,腾讯后台开发

阅读量:
img
img

既提供给初学者使用的零基础学习材料,在职三年以上的开发者则能通过该课程实现专业技能的全面提升与系统知识储备

因为大量文件存在,在此仅作为参考提供了一些目录截图。其中包括大厂面试题库、学习笔记整理、源码解析以及实战项目案例分析等丰富内容。同时后续也会不断更新和完善。

如果你需要这些资料,可以戳这里获取

不同的体系架构拥有不同的机器特性

  • 机器字长:运行环境是基于64位还是32位的操作系统?
    • 字节顺序:系统的字节顺序设置为大端制还是小端制?
    • 对齐策略:程序设计中是否必须采用以4字节为单位的对齐方式访问内存?
    • 数据类型属性:默认的数据类型是带有符号位还是不带符号位?
    • MMU支持情况:该系统是否支持内存管理单元(MMU)功能?

交叉编译时的主机环境与目标环境不同

  • 配置设置:
    • HOST编译器与TARGET编译器之间的差异:
    • 工具链泄露问题:
    • 库文件:
    • 测试:

具体的比较分析可以参考这篇文章:Introduction to cross-compiling for Linux。这部分内容已经较为全面地阐述过了。

第 2 章 交叉编译链

2.1 什么是交叉编译链

明白了什么是交叉编译,那我们来看看什么是交叉编译链。

首先这个构建流程是由不同功能模块依据顺序由多个部分构成的

编译流程

其核心涵盖了预处理阶段、编译阶段以及汇编阶段等关键环节,并伴随着一系列必要的操作流程。鉴于系统中存在不同的子功能模块,在设计架构时采用了分层化策略,在每一个子模块中都独立开发相应的功能实现模块,在整体上形成了一个完整的开发工具体系

同时,在编译过程中也存在明确的时间序列。其必然涉及到工具使用的次序问题。各个工具按照相互关联的方式依次排列。从而形成了一个具有连锁性质的系统结构。

其主要目标是交叉编译链构建一个完整的工具集以处理跨平台架构的源代码生成过程。该系统省略了预处理 编译 汇编以及链接等常规步骤 当指定.c源文件时 自动选择并调用相应的辅助工具 最终完成可执行文件(.bin)的生成

注意

2.2 交叉编译链的命名规则

我们使用交叉编译链时,常常会看到这样的名字:

复制代码
    arm-none-linux-gnueabi-gcc
    arm-cortex_a8-linux-gnueabi-gcc
    mips-malta-linux-gnu-gcc

其中,对应的前缀为:

复制代码
    arm-none-linux-gnueabi-
    arm-cortex_a8-linux-gnueabi-
    mips-malta-linux-gnu-

这些交叉编译链的命名规则似乎是通用的,有一定的规则:

复制代码
    arch-core-kernel-system
  • arch: 目标平台采用何种架构?
  • core: 采用的是哪种CPU核心架构?其中常见的包括Cortex A8系列。
    然而,在实际应用中这一命名策略显得非常灵活,在不同厂家提供的交叉编译链中通常会有以下几种命名方式:
  • 以厂家名称命名(如华为麒麟系列)
  • 以开发板命名(如联发科天玑系列)
  • 或者直接标注为none或cross
  • kernel: 所运行的操作系统是什么?常见选项包括Linux、uclinux以及完全无内核操作系统的bare模式
  • systen: 交叉编译链遵循什么规范?例如遵循GNU规范则会使用glibc+oabi接口;而遵循GNUEABI规范则会使用glibc+eabi接口

_提示:这一规定是一个推测,并未在任何官方资料中得到证实。然而,在某些编译链中发现其命名与该规定并不相符,并未能解释其是否因历史原因而产生。如有关于该规定的详细描述,请指正以供参考。

第 3 章 包含的工具

3.1 Binutils

Binutils属于GNU工具家族中的一员。它包含多种功能:如链接器、汇编器以及其他用于管理目标文件和档案的工具。它主要负责处理和维护二进制代码。

Binutils工具包含的子程序如下:

  • ld GNU链接器。
  • as GNU编译器。
  • addr2line 地址转文件名及行号转换器。
  • ar 用于创建、修改和提取档案的实用工具。
  • c++filt 解析编码C++符号的过滤器。
  • dlltool 用于构建及使用DLL的文件创建工具。
  • gold 一款快速运行的ELF链接器(仍在贝塔测试中)。
  • gprof 显示性能 profiling 信息。
  • nlmconv 将对象码转换为NLM格式。
  • nm 列出对象文件中的符号信息。
  • objcopy 复制并翻译对象文件内容。
  • objdump 显示对象文件信息详情。
  • ranlib 生成档案内容目录索引工具。
  • readelf 显示任意ELF格式对象文件中的信息内容。
  • size 列出文件或档案各部分大小信息表。
  • strings 列出可打印字符串内容列表。
  • strip 删除符号信息内容选项功能模块.

binutils介绍

3.2 GCC

GNU编译器套件,支持C, C++, Java, Ada, Fortran, Objective-C等众多语言。

3.3 GLibc

在Linux系统中常用作C函数库的有glibc。在Linux系统中处于底层核心地位的是glibc,几乎所有的运行库都依赖于它。除了包装Linux操作系统提供的基础服务之外,glibc还实现了许多其他必要的功能服务的具体实现。

glibc 各个库作用介绍

由于嵌入式系统环境对硬件资源需求极为紧迫,在glibc之外已经提供了uC libc和e libc两种替代方案可供选择;它们之间的关系及适用场景可在以下两篇文献中找到详细说明:

uclibc eglibc glibc之间的区别和联系

Glibc vs uClibc Differences

3.4 GDB

GDB用于调试程序

第 4 章 如何得到交叉编译链

既然认识到交叉编译链的功能,在针对嵌入式系统开发时,请问交叉编译链来自何处?

主要有三个方式可以获取

4.1 下载已经做好的交叉编译链

我们只需找到合适的交叉编译工具链,并下载并利用即可

常见的交叉编译链下载地址:

  1. 可从FTP链接地址处获取必要的交叉编译链
  2. 亦可通过访问网站获取相关的交叉编译链
  3. 建议访问该网站获取所需资源
  4. 在很多工具包中包含现成的交叉编译链套装, 比如说crosstool-NG
  5. 通常情况下, 购买特定芯片或开发板时, 厂商会赠送配套的完整开发软件包, 其中自然包括所需的交叉编译链

通常情况下,厂家提供的工具都是通过严格的测试完成的,并在必要时加入了这些补丁以增强性能。因此,在这种情况下,选择这样的工具作为来源是最可靠的选择。

img
img

丰富的网络学习资源层出不穷,然而若所学知识缺乏系统性,则容易导致仅停留在表面层次、不加深入探究的现象出现。

具体解释

需要这份系统化的资料的朋友, 可以选择点击此处下载

单兵作战效率高,而团队协作则更具优势!无论你是IT行业的资深从业者还是新兴领域的学习者,都欢迎加入我们的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),共同进步与成长!

浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

寻求此份系统化资料的朋友,请问是否需要进一步的帮助?如需获取相关资料,请点击此处访问该链接:

寻求此份系统化资料的朋友,请问是否需要进一步的帮助?如需获取相关资料,请点击此处访问该链接:

独自一人行走速度很快,但是一群人则能够走得更远。无论你是IT行业的资深从业者还是对此领域充满热情的新手,我们始终欢迎你的加入!在这里,你可以享受到丰富的技术交流机会,获取实用的学习资源,分享职场趣事,参与大厂内推活动,并获得专业的面试辅导帮助,让我们共同进步与成长!

全部评论 (0)

还没有任何评论哟~