创建网站需要哪些过程,代码解决wordpress不能发邮件,2023年天津市施工招标公告时间,做国外贸易的网站【cmake实战#xff1a;番外】交叉编译——Linaro 一、交叉编译1、交叉编译简介2、为什么会有交叉编译 二、交叉编译链1、什么是交叉编译链2、交叉编译工具 三、Linaro1、下载2、解压3、demo3.1、toolchain_aarch64.cmake3.2、CMakeLists.txt3.3、main.cpp 4、执行编译5、查看… 【cmake实战番外】交叉编译——Linaro 一、交叉编译1、交叉编译简介2、为什么会有交叉编译 二、交叉编译链1、什么是交叉编译链2、交叉编译工具 三、Linaro1、下载2、解压3、demo3.1、toolchain_aarch64.cmake3.2、CMakeLists.txt3.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。 AArch64 GNU/Linux target (aarch64-none-linux-gnu) 架构AArch64ARM 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) 架构AArch64ARM 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/local3、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 iostreamint main()
{std::couthello world\n;
}4、执行编译
start.sh
cmake -B build_arm \
-DCMAKE_BUILD_TYPErelease \
-DLINUX_ABIarm64 \
-DCMAKE_TOOLCHAIN_FILE../toolchain_aarch64.cmake
cmake --build build_arm -j 16 --config release5、查看编译的可执行程序
如下图可见生成程序的架构为AArch64
readelf -h ./processCMake交叉编译配置实例