当前位置: 首页 > news >正文

【cmake实战:番外】交叉编译——Linaro

【cmake实战:番外】交叉编译——Linaro

  • 一、交叉编译
    • 1、交叉编译简介
    • 2、为什么会有交叉编译
  • 二、交叉编译链
    • 1、什么是交叉编译链
    • 2、交叉编译工具
  • 三、Linaro
    • 1、下载
    • 2、解压
    • 3、demo
      • 3.1、toolchain_aarch64.cmake
      • 3.2、CMakeLists.txt
      • 3.3、main.cpp
    • 4、执行编译
    • 5、查看编译的可执行程序

原创作者:郑同学的笔记
原创地址:https://zhengjunxue.blog.csdn.net/article/details/132722319
qq技术交流群:921273910

一、交叉编译

1、交叉编译简介

  • 本地编译

本地编译可以理解为,在当前编译平台下,编译出来的程序只能放到当前平台下运行。平时我们常见的软件开发,都是属于本地编译:

比如,我们在 x86 平台上,编写程序并编译成可执行程序。这种方式下,我们使用 x86 平台上的工具,开发针对 x86 平台本身的可执行程序,这个编译过程称为本地编译。

  • 交叉编译

交叉编译可以理解为,在当前编译平台下,编译出来的程序能运行在体系结构不同的另一种目标平台上,但是编译平台本身却不能运行该程序:

比如,我们在 x86 平台上,编写程序并编译成能运行在 ARM 平台的程序,编译得到的程序在 x86 平台上是不能运行的,必须放到 ARM 平台上才能运行。

2、为什么会有交叉编译

交叉编译的主要原因是开发和构建应用程序时,目标平台与开发主机的体系结构不同。以下是一些常见情况,会导致需要进行交叉编译:

  • 嵌入式系统开发:嵌入式系统通常使用特定的处理器架构和操作系统,与开发主机不同。为了在嵌入式设备上运行应用程序,需要使用交叉编译工具链将代码从开发主机编译为适用于目标平台的可执行文件。

  • 跨平台开发:如果你希望在多个平台上运行应用程序(例如,Windows、Linux、MacOS等),可以使用交叉编译来生成适用于不同平台的可执行文件。这样可以节省时间和精力,并确保应用程序在各个平台上都能正常运行。

  • 性能优化:有时,为了提高应用程序的性能,可能需要在更高性能的目标平台上进行编译。通过交叉编译,可以在较强的硬件平台上将应用程序进行优化,并在其他相对较弱的平台上运行。

  • 保护知识产权:交叉编译还可以用于保护知识产权或代码的专有性。通过在开发主机上进行编译,可以防止直接在目标平台上暴露源代码,从而提高应用程序的安全性。

总之,交叉编译提供了一种灵活的方式,允许开发人员在不同体系结构和操作系统的平台上开发和构建应用程序。它为跨平台开发、嵌入式系统开发和性能优化等方面提供了便利,并提高了代码的安全性和保护知识产权的能力。

二、交叉编译链

1、什么是交叉编译链

  • 编译流程
    可以分解为4个步骤,分别是预处理(Prepressing)、编译(Compilation)、汇编(Assembly)和链接(Linking),如图所示。
    在这里插入图片描述

因此,交叉编译链就是为了编译跨平台体系结构的程序代码而形成的由多个子工具构成的一套完整的工具集。同时,它隐藏了预处理、编译、汇编、链接等细节,当我们指定了源文件(.c)时,它会自动按照编译流程调用不同的子工具,自动生成最终的二进制程序

2、交叉编译工具

目前主流的交叉编译工具链有以下几种:

  • Linaro 提供的 ARM 交叉编译工具链,可以到 Linaro 官网 Linaro Releases 去下载已经制作好的交叉编译工具链¹。
  • yagarto 提供的 ARM 交叉编译工具链,可以到 yagarto 官网 Yet another GNU ARM toolchain 去下载已经制作好的交叉编译工具链¹。
  • crosstool-ng 是一个用于构建自定义交叉编译工具链的工具,它可以支持多种目标平台和配置选项,可以到 crosstool-ng 官网 crosstool-ng 去下载源码并按照文档进行安装和使用²。
  • buildroot 是一个用于构建嵌入式 Linux 系统的工具,它可以自动下载、配置、编译和安装交叉编译工具链、内核、根文件系统等组件,可以到 buildroot 官网 Buildroot 去下载源码并按照文档进行安装和使用³。

常用的交叉编译工具链

三、Linaro

1、下载

  • Linaro:官网下载https://www.linaro.org/downloads/
  • 首先,点击from the Arm website.(如下图)
    在这里插入图片描述
  • 然后,点击Download Arm GNU Toolchain(如下图)
    在这里插入图片描述
  • 最后,点击arm-gnu-toolchain-12.3.rel1-x86_64-aarch64-none-linux-gnu.tar.xz(如下图)
    在这里插入图片描述

这两个版本都是针对 AArch64 架构的 GNU/Linux 目标,也就是 ARM 64 位架构。它们的主要区别在于字节序(Endianness)。

  1. AArch64 GNU/Linux target (aarch64-none-linux-gnu):
    架构:AArch64(ARM 64 位)
    字节序:默认为小端字节序(Little Endian)
    文件名示例:gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz
    AArch64 GNU/Linux target (aarch64_be-none-linux-gnu):

  2. 架构:AArch64(ARM 64 位)
    字节序:大端字节序(Big Endian)
    文件名示例:gcc-arm-10.3-2021.07-x86_64-aarch64_be-none-linux-gnu.tar.xz
    大多数情况下,我们使用的是小端字节序(Little Endian),因此针对小端字节序的版本更为常见和普遍。大端字节序(Big Endian)版本在特定的应用场景中使用较少,例如某些嵌入式系统或遗留系统可能需要使用大端字节序。


    因此,如果你计划在普通的 ARM 64 位系统上进行开发和编译,建议选择 aarch64-none-linux-gnu 版本。如果你的目标平台或项目需要使用大端字节序,可以选择 aarch64_be-none-linux-gnu 版本。

2、解压

sudo tar -xvf ./gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz -C /usr/local

3、demo

3.1、toolchain_aarch64.cmake

set(CMAKE_SYSTEM_NAME linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)set(TOOLCHAIN_DIR /usr/local/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu)set(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/bin/aarch64-none-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/bin/aarch64-none-linux-gnu-g++)#指定交叉编译环境的目录
set(CMAKE_FIND_ROOT_PATH "${ARM_SYSROOT}")
#从来不在指定目录(交叉编译)下查找工具程序。(编译时利用的是宿主的工具)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
#只在指定目录(交叉编译)下查找库文件
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
#只在指定目录(交叉编译)下查找头文件
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
#只在指定的目录(交叉编译)下查找依赖包
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

3.2、CMakeLists.txt

cmake_minimum_required(VERSION 3.0.0)project(process)add_executable("${PROJECT_NAME}" main.cpp)set(EXECUTABLE_OUTPUT_PATH "${PROJECT_SOURCE_DIR}/lib")

3.3、main.cpp

#include <iostream>int main()
{std::cout<<"hello world\n";
}

4、执行编译

  • start.sh
cmake -B build_arm \
-DCMAKE_BUILD_TYPE=release \
-DLINUX_ABI=arm64 \
-DCMAKE_TOOLCHAIN_FILE=../toolchain_aarch64.cmake
cmake --build build_arm -j 16 --config release

在这里插入图片描述

5、查看编译的可执行程序

  • 如下图,可见生成程序的架构为AArch64
readelf -h ./process

在这里插入图片描述
在这里插入图片描述

CMake交叉编译配置实例

相关文章:

【cmake实战:番外】交叉编译——Linaro

【cmake实战&#xff1a;番外】交叉编译——Linaro 一、交叉编译1、交叉编译简介2、为什么会有交叉编译 二、交叉编译链1、什么是交叉编译链2、交叉编译工具 三、Linaro1、下载2、解压3、demo3.1、toolchain_aarch64.cmake3.2、CMakeLists.txt3.3、main.cpp 4、执行编译5、查看…...

2024年年初Java5年实战面试题(北京)

高阶篇&#xff1a; 一、在面对千万条并发请求的情况下&#xff0c;如果数据库频繁查询导致崩溃&#xff0c;可以采取以下措施来解决问题: 1.缓存数据:可以使用缓存技术来减少对数据库的查询次数。将经常查询的数据存储在缓存中&#xff0c;例如使用Redis等内存数据库&#xff…...

【Apache-2.0】springboot-openai-chatgpt超级AI大脑产品架构图

springboot-openai-chatgpt: 一个基于SpringCloud的Chatgpt机器人&#xff0c;已对接GPT-3.5、GPT-4.0、百度文心一言、stable diffusion AI绘图、Midjourney绘图。用户可以在界面上与聊天机器人进行对话&#xff0c;聊天机器人会根据用户的输入自动生成回复。同时也支持画图&a…...

如何在iPhone设备中查看崩溃日志

​ 目录 如何在iPhone设备中查看崩溃日志 摘要 引言 导致iPhone设备崩溃的主要原因是什么&#xff1f; 使用克魔助手查看iPhone设备中的崩溃日志 奔溃日志分析 总结 摘要 本文介绍了如何在iPhone设备中查看崩溃日志&#xff0c;以便调查崩溃的原因。我们将展示三种不同的…...

对接第三方接口鉴权(Spring Boot+Aop+注解实现Api接口签名验证)

前言 一个web系统&#xff0c;从接口的使用范围也可以分为对内和对外两种&#xff0c;对内的接口主要限于一些我们内部系统的调用&#xff0c;多是通过内网进行调用&#xff0c;往往不用考虑太复杂的鉴权操作。但是&#xff0c;对于对外的接口&#xff0c;我们就不得不重视这个…...

微服务-理论(CAP,一致性协议)

CAP理论 关于CAP理论的介绍可以直接看这篇文章 CAP分别是什么&#xff1f; 一致性&#xff08;Consistency 一致性包括强一致性&#xff0c;弱一致性&#xff0c;最终一致性。 一致性其实是指数据的一致性&#xff0c;为什么数据会不一致呢&#xff1f; 如上面这张图&…...

CTFshow web入门web128-php特性31

开启环境: 一个新的姿势&#xff0c;当php扩展目录下有php_gettext.dll时&#xff1a; _()是一个函数。 _()gettext() 是gettext()的拓展函数&#xff0c;开启text扩展get_defined_vars — 返回由所有已定义变量所组成的数组。 call_user_func — 把第一个参数作为回调函数调…...

再见2023,你好2024(附新年烟花python实现)

亲爱的朋友们&#xff1a; 写点什么呢&#xff0c;我已经停更两个月了。2023年快结束了&#xff0c;时间真的过得好快&#xff0c;总要写点什么留下纪念吧。这一年伴随着许多挑战和机会&#xff0c;给了我无数的成长和体验。坦白说&#xff0c;有时候我觉得自己好像是在时间的…...

Redis 的常用命令

一、Redis 通用命令 TYPE key&#xff1a;返回 key 所储存的值的类型。 OBJECT ENCODING key&#xff1a;返回key所储存的值的底层编码方式。 DEL key&#xff1a;该命令用于在 key 存在时删除 key。 EXPIRE key seconds&#xff1a;设置指定key的过期时间。 RENAME key newke…...

【模拟电路】模拟集成电路之神-NE555

一、集成电路NE555简介 二、功能框图与引脚说明 三、比较器&#xff08;运放&#xff09; 四、反相门&#xff08;非门&#xff09; 五、或非门 六、双稳态触发器 七、NE555的工作原理 集成电路NE555的芯片手册 C5157696 一、集成电路NE555简介 NE555起源于上个世纪70年代&a…...

收集最新的 Sci-Hub 网址(本文章持续更新2024)

自用收集最新的 Sci-Hub 网址 本文章持续更新收集 Sci-Hub 的可用网址链接仅供交流学习使用&#xff0c;如对您有所帮助&#xff0c;请收藏并推荐给需要的朋友&#xff0c;由于网站限制&#xff0c;不一定所有网址都能在您所在的位置访问&#xff0c;通常情况下&#xff0c;一…...

针对NPC客户端的升级(脚本执行)

上一次我们使用NPS自动注册的方式&#xff0c;在被控端上实现了自动创建NPC客户端链接。 Linux主机自动注册NPS客户端&#xff08;脚本化&#xff09; 但是在使用过程中我发现存在很多的问题&#xff0c;如果被控端重启客户端或者出现了多个NPS时会造成冲突&#xff0c;所以考虑…...

[每周一更]-(第51期):Go的调度器GMP

参考文献 https://learnku.com/articles/41728http://go.cyub.vip/gmp/gmp-model.html#g-m-phttps://blog.csdn.net/ByteDanceTech/article/details/129292683https://www.ququ123.top/2022/04/golang_gmp_principle/ 什么是GMP? GMP模型是Go语言并发模型的核心概念&#x…...

阿里云和腾讯云服务器系统盘40G或50G空间够用吗?

云服务器系统盘40G或50G空间够用吗&#xff1f;够用&#xff0c;操作系统一般占用几个GB的存储空间&#xff0c;尤其是Linux操作系统占用空间容量更小&#xff0c;阿里云和腾讯云服务器系统盘默认提供的40GB高效云盘或50G通用型SSD云硬盘&#xff0c;阿腾云atengyun.com分享是否…...

网络层协议 ——— IP协议

文章目录 IP协议基本概念IP协议格式分片与组装网段划分特殊的IP地址IP地址的数量限制私网IP地址和公网IP地址路由路由表生成算法 IP协议 IP协议全称为“网际互连协议&#xff08;Internet Protocol&#xff09;”&#xff0c;IP协议是TCP/IP体系中的网络层协议。 基本概念 网…...

MATLAB --- interp1( )函数的用法

interp1() 是 MATLAB 中用于一维插值的函数&#xff0c; 它可以根据给定的数据点进行插值&#xff0c;从而在给定的插值点处估计函数的值 下面是 interp1() 函数的用法&#xff1a; Vq interp1(X, V, Xq) Vq interp1(X, V, Xq, method) Vq interp1(X, V, Xq, method, extr…...

【react-taro-canvas】用canvas手写一个数字、字母混合的行为验证码

用canvas手写一个数字、字母混合的行为验证码 实现效果源码 实现效果 源码 import Taro from "tarojs/taro"; import { View, Canvas, Input, Button } from "tarojs/components"; import { useState, useEffect } from "react"; // 画随机线函…...

ctfshow——信息搜集

文章目录 web 1web 2web 3web 4web 5web 6web 7web 8web 9web 10web 11web 12web 13web 14web 15web 16web 17web 18web 19web 20 web 1 题目提示开发注释未及时删除。 直接右键查看源代码。 web 2 在这关我们会发现&#xff1a;1&#xff09;无法使用右键查看源代码&…...

【Linux驱动】设备树模型的LED驱动 | 查询方式的按键驱动

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《Linux驱动》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 目录 &#x1f36e;设备树模型的LED驱动&#x1f369;设备树文件&#x1f369;驱动程序 &#x1…...

GZ075 云计算应用赛题第4套

2023年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项赛卷4 某企业根据自身业务需求&#xff0c;实施数字化转型&#xff0c;规划和建设数字化平台&#xff0c;平台聚焦“DevOps开发运维一体化”和“数据驱动产品开发”&#xff0c;拟采用开源OpenSt…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...