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

【OpenHarmony】【交叉编译】使用gn在Linux编译3568a上运行的可执行程序

linux下编译arm64可执行程序

  • 一.gn ninja安装
  • 二.交叉编译工具链安装
    • 1.arm交叉编译工具
    • 2.安装arm64编译器
  • 三. gn文件添加arm及arm64工具链
  • 四.编译验证

本文以gn nijia安装中demo为例,将其编译为在arm64(rk_3568_a开发板)环境下可运行的程序

一.gn ninja安装

安装gn ninja,参考文章gn nijia安装

二.交叉编译工具链安装

1.arm交叉编译工具

arm交叉编译工具链为: arm-linux-gnueabihf,官网有编译好的二进制文件,直接下载解压即可

1.创建目录存放下载的文件

mkdir ~/linux/tools&&cd ~/linux/tools

2.下载交叉编译链 gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz

wget https://releases.linaro.org/components/toolchain/binaries/4.9-2017.01/arm-linux-gnueabihf/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz

3./usr/local下创建目录并将其解压到该目录下

sudo mkdir /usr/local/arm&&sudo tar -vxf gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz -C /usr/local/arm

4.配置环境变量

sudo vim ~/.bashr

在最下面添加一行

export PATH=$PATH:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin

环境变量立即生效

source ~/.bashrc

5.安装其他库

sudo apt-get install lsb-core lib32stdc++6

6.查看安装是否成功

arm-linux-gnueabihf-gcc -v

输出

ubuntu:~/Downloads/gn_test$ arm-linux-gnueabihf-gcc -v
Using built-in specs.
COLLECT_GCC=arm-linux-gnueabihf-gcc
COLLECT_LTO_WRAPPER=/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/../libexec/gcc/arm-linux-gnueabihf/4.9.4/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: /home/tcwg-buildslave/workspace/tcwg-make-release/label/docker-trusty-amd64-tcwg-build/target/arm-linux-gnueabihf/snapshots/gcc-linaro-4.9-2017.01/configure SHELL=/bin/bash --with-mpc=/home/tcwg-buildslave/workspace/tcwg-make-release/label/docker-trusty-amd64-tcwg-build/target/arm-linux-gnueabihf/_build/builds/destdir/x86_64-unknown-linux-gnu --with-mpfr=/home/tcwg-buildslave/workspace/tcwg-make-release/label/docker-trusty-amd64-tcwg-build/target/arm-linux-gnueabihf/_build/builds/destdir/x86_64-unknown-linux-gnu --with-gmp=/home/tcwg-buildslave/workspace/tcwg-make-release/label/docker-trusty-amd64-tcwg-build/target/arm-linux-gnueabihf/_build/builds/destdir/x86_64-unknown-linux-gnu --with-gnu-as --with-gnu-ld --disable-libmudflap --enable-lto --enable-objc-gc --enable-shared --without-included-gettext --enable-nls --disable-sjlj-exceptions --enable-gnu-unique-object --enable-linker-build-id --disable-libstdcxx-pch --enable-c99 --enable-clocale=gnu --enable-libstdcxx-debug --enable-long-long --with-cloog=no --with-ppl=no --with-isl=no --disable-multilib --with-float=hard --with-mode=thumb --with-tune=cortex-a9 --with-arch=armv7-a --with-fpu=vfpv3-d16 --enable-threads=posix --enable-multiarch --enable-libstdcxx-time=yes --with-build-sysroot=/home/tcwg-buildslave/workspace/tcwg-make-release/label/docker-trusty-amd64-tcwg-build/target/arm-linux-gnueabihf/_build/sysroots/arm-linux-gnueabihf --with-sysroot=/home/tcwg-buildslave/workspace/tcwg-make-release/label/docker-trusty-amd64-tcwg-build/target/arm-linux-gnueabihf/_build/builds/destdir/x86_64-unknown-linux-gnu/arm-linux-gnueabihf/libc --enable-checking=release --disable-bootstrap --enable-languages=c,c++,fortran,lto --build=x86_64-unknown-linux-gnu --host=x86_64-unknown-linux-gnu --target=arm-linux-gnueabihf --prefix=/home/tcwg-buildslave/workspace/tcwg-make-release/label/docker-trusty-amd64-tcwg-build/target/arm-linux-gnueabihf/_build/builds/destdir/x86_64-unknown-linux-gnu
Thread model: posix
gcc version 4.9.4 (Linaro GCC 4.9-2017.01)

2.安装arm64编译器

步骤与安装arm编译链相同
1.创建目录存放下载的文件并进入

mkdir ~/linux/tools&&cd ~/linux/tools

2.下载交叉编译链 gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz

wget https://releases.linaro.org/components/toolchain/binaries/latest-7/aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz

3./usr/local下创建目录并将其解压到该目录下

sudo mkdir /usr/local/arm64&&sudo tar -vxf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz -C /usr/local/arm

4.配置环境变量

sudo vim ~/.bashr

在最下面添加一行

export PATH=$PATH:/usr/local/arm64gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin

环境变量立即生效

source ~/.bashrc

5.验证是否安装成功

ubuntu:~/linux/tools$ aarch64-linux-gnu-gcc -v
Using built-in specs.
COLLECT_GCC=aarch64-linux-gnu-gcc
COLLECT_LTO_WRAPPER=/usr/local/arm64/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/../libexec/gcc/aarch64-linux-gnu/7.5.0/lto-wrapper
Target: aarch64-linux-gnu
Configured with: '/home/tcwg-buildslave/workspace/tcwg-make-release_0/snapshots/gcc.git~linaro-7.5-2019.12/configure' SHELL=/bin/bash --with-mpc=/home/tcwg-buildslave/workspace/tcwg-make-release_0/_build/builds/destdir/x86_64-unknown-linux-gnu --with-mpfr=/home/tcwg-buildslave/workspace/tcwg-make-release_0/_build/builds/destdir/x86_64-unknown-linux-gnu --with-gmp=/home/tcwg-buildslave/workspace/tcwg-make-release_0/_build/builds/destdir/x86_64-unknown-linux-gnu --with-gnu-as --with-gnu-ld --disable-libmudflap --enable-lto --enable-shared --without-included-gettext --enable-nls --with-system-zlib --disable-sjlj-exceptions --enable-gnu-unique-object --enable-linker-build-id --disable-libstdcxx-pch --enable-c99 --enable-clocale=gnu --enable-libstdcxx-debug --enable-long-long --with-cloog=no --with-ppl=no --with-isl=no --disable-multilib --enable-fix-cortex-a53-835769 --enable-fix-cortex-a53-843419 --with-arch=armv8-a --enable-threads=posix --enable-multiarch --enable-libstdcxx-time=yes --enable-gnu-indirect-function --with-build-sysroot=/home/tcwg-buildslave/workspace/tcwg-make-release_0/_build/sysroots/aarch64-linux-gnu --with-sysroot=/home/tcwg-buildslave/workspace/tcwg-make-release_0/_build/builds/destdir/x86_64-unknown-linux-gnu/aarch64-linux-gnu/libc --enable-checking=release --disable-bootstrap --enable-languages=c,c++,fortran,lto --build=x86_64-unknown-linux-gnu --host=x86_64-unknown-linux-gnu --target=aarch64-linux-gnu --prefix=/home/tcwg-buildslave/workspace/tcwg-make-release_0/_build/builds/destdir/x86_64-unknown-linux-gnu
Thread model: posix
gcc version 7.5.0 (Linaro GCC 7.5-2019.12)

三. gn文件添加arm及arm64工具链

修改gn nijia安装中的toolchain目录下的BUILD.gn文件
修改为下面内容

toolchain("arm") {toolprefix = "arm-linux-gnueabihf-"cc = "${toolprefix}gcc"cxx = "${toolprefix}g++"ar = "${toolprefix}ar"
#    #ld = cxx
#    #readelf = "${toolprefix}readelf"
#    #nm = "${toolprefix}nm"
#
#    toolchain_args = {
#      current_cpu = "arm"
#      current_os = "linux"
#      is_clang = false
#    }tool("cc") {depfile = ".d"command = "${cc} -MMD -MF $depfile -c {{source}} -o {{output}}"depsformat = "gcc"description = "CXX"outputs = ["{{target_output_name}}.{{source_name_part}}.o",]}tool("cxx") {depfile = ".d"command = "${cxx} -MMD -MF $depfile -c {{source}} -o {{output}}"depsformat = "gcc"description = "CXX"outputs = ["{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o",]}tool("link") {outfile = "{{output_dir}}/bin/{{target_output_name}}{{output_extension}}"rspfile = "{{output}}.rsp"command = "${cxx} -o $outfile @$rspfile"description = "LINK $outfile"rspfile_content = "{{inputs}}"outputs = [outfile,]default_output_dir = "{{root_out_dir}}"}tool("solink") {soname = ""sofile = "/$soname"rspfile = "{{output}}.rsp"command = "${cxx} -shared -o $sofile -Wl, -soname=$soname @$rspfile"description = "SOLINK $soname"rspfile_content = "{{inputs}}"outputs = [sofile,]default_output_extension = ".so"default_output_dir = ""link_output = sofiledepend_output = sofileoutput_prefix = "lib"}tool("alink") {rspfile = "{{output}}.rsp"command = "${ar} rcs {{output}} @\"$rspfile\""description = "AR"rspfile_content = "{{inputs}}"outputs = ["{{target_out_dir}}/{{target_output_name}}{{output_extension}}",]default_output_extension = ".a"output_prefix = "lib"}}toolchain("arm64") {toolprefix = "aarch64-linux-gnu-"cc = "${toolprefix}gcc"cxx = "${toolprefix}g++"ar = "${toolprefix}ar"#ld = cxx#readelf = "${toolprefix}readelf"#nm = "${toolprefix}nm"#toolchain_args = {#  current_cpu = "arm64"#  current_os = "linux"#  is_clang = false#}tool("cc") {depfile = ".d"command = "${cc} -MMD -MF $depfile -c {{source}} -o {{output}}"depsformat = "gcc"description = "CXX"outputs = ["{{target_output_name}}.{{source_name_part}}.o",]}tool("cxx") {depfile = ".d"command = "${cxx} -MMD -MF $depfile -c {{source}} -o {{output}}"depsformat = "gcc"description = "CXX"outputs = ["{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o",]}tool("link") {outfile = "{{output_dir}}/bin/{{target_output_name}}{{output_extension}}"rspfile = "{{output}}.rsp"command = "${cxx} -o $outfile @$rspfile"description = "LINK $outfile"rspfile_content = "{{ldflags}} {{inputs}}"outputs = [outfile,]default_output_dir = "{{root_out_dir}}"}tool("solink") {soname = ""sofile = "/$soname"rspfile = "{{output}}.rsp"command = "${cxx} -shared -o $sofile -Wl, -soname=$soname @$rspfile"description = "SOLINK $soname"rspfile_content = "{{ldflags}} {{inputs}}"outputs = [sofile,]default_output_extension = ".so"default_output_dir = ""link_output = sofiledepend_output = sofileoutput_prefix = "lib"}tool("alink") {rspfile = "{{output}}.rsp"command = "${ar} rcs {{output}} @\"$rspfile\""description = "AR"rspfile_content = "{{inputs}}"outputs = ["{{target_out_dir}}/{{target_output_name}}{{output_extension}}",]default_output_extension = ".a"output_prefix = "lib"}}

修改BUILDCONFIG.gn文件,将工具链指向arm64

set_default_toolchain("//build/toolchain:arm64")

修改与main.cc同目录下的BUILD.gn文件,使用静态编译,避免链接器不同导致的无法执行问题

# 声明一个可执行文件目标
executable("hello") {# 源文件列表sources = [ "main.cc" ]# 编译选项(可选)cflags = ["-Wall","-Werror",]# 链接选项(可选)ldflags = [ "-static"]
}

四.编译验证

在main.cc所在目录下执行如下命令

gn gen out/arm64 --args='target_cpu="arm64"'
ninja -v -C out/arm64/

生成的目标文件位于out/arm64/bin目录下
file查看该文件属性

@ubuntu:~/Downloads/gn_test$ file out/arm64/bin/hello
out/arm64/bin/hello: ELF 64-bit LSB executable, ARM aarch64, version 1 (GNU/Linux), statically linked, for GNU/Linux 3.7.0, BuildID[sha1]=2e4c0e468fd229cb5875041d4afb5a529cd41206, with debug_info, not stripped

将该文件推送到arm64环境下,添加可执行权限并执行

# chmod a+x hello
# ./hello
Hello, World!

成功运行

参考:
https://www.jianshu.com/p/5d762cca83a0
https://blog.csdn.net/p1279030826/article/details/105021536

相关文章:

【OpenHarmony】【交叉编译】使用gn在Linux编译3568a上运行的可执行程序

linux下编译arm64可执行程序 一.gn ninja安装二.交叉编译工具链安装1.arm交叉编译工具2.安装arm64编译器 三. gn文件添加arm及arm64工具链四.编译验证 本文以gn nijia安装中demo为例,将其编译为在arm64(rk_3568_a开发板)环境下可运行的程序 一.gn ninja安装 安装g…...

Med-R1论文阅读理解-1

论文总结:Med-R1: Reinforcement Learning for Generalizable Medical Reasoning in Vision-Language Models 论文写了什么? 本文提出了一种名为 Med-R1 的新框架,旨在通过强化学习(Reinforcement Learning, RL)提升…...

【从零开始学习QT】快捷键、帮助文档、Qt窗口坐标体系

目录 Qt Creator 中的快捷键 使用帮助文档 Qt 窗口坐标体系 QT专栏:QT_uyeonashi的博客-CSDN博客 Qt Creator 中的快捷键 • 注释:ctrl / • 运行:ctrl R • 编译:ctrl B • 字体缩放:ctrl 鼠标滑轮 • 查找&am…...

强化学习笔记总结(结合论文)

本篇博客参考来自大佬的开源书籍,结合自己的思考,写了这一篇总结,帮助大家学习了解强化学习的基础知识 文章目录 强化学习特点定义 强化学习应用实例强化学习和监督式学习、非监督式学习分类强化学习和监督式学习的区别:强化学习…...

Java线程安全解决方案全面指南

Java线程安全解决方案全面指南 引言 在多线程编程中,线程安全是保证程序正确性的关键要素。Java作为一门广泛用于并发编程的语言,提供了丰富的线程安全解决方案。本文将全面介绍Java中实现线程安全的各类方法,帮助开发者编写出更健壮的多线…...

superior哥深度学习系列(大纲)

🚀 superior哥深度学习系列学习大纲(2025版) 嘿!各位AI探索者们!👋 这是superior哥精心打造的深度学习学习路线图。从零基础小白到AI实战高手,这份大纲会陪你一路成长!记住&#xff…...

基于stm32的多旋翼无人机(Multi-rotor UAV based on stm32)

由于一直在调试本项目,好久没有发文章,最近本项目的PID调试初见成效!开始正文前首先感谢各位粉丝的支持,以及对本项目技术上支持的老师以及师兄,谢谢你们! 对应源码及文件:源码及文件下载 基于…...

实验分享|基于sCMOS相机科学成像技术的耐高温航空涂层材料损伤检测实验

1实验背景 航空发动机外壳的耐高温涂层材料在长期高温、高压工况下易产生微小损伤与裂纹,可能导致严重安全隐患。传统光学检测手段受限于分辨率与灵敏度,难以捕捉微米级缺陷,且检测效率低下。 某高校航空材料实验室,采用科学相机…...

RAG混合检索:倒数秩融合RRF算法

文章目录 检索增强生成 (RAG)倒数秩融合在 RAG 中的工作原理RRF 背后的数学直觉检索增强生成 (RAG) RAG 是自然语言处理中的一种强大技术,结合了基于检索的模型和生成模型的优势。 如果检索器未能从检索器中获取相关文档,则精度较低,幻觉的可能性会增加。 有些查询适合…...

2011肠衣问题

1 D类竞赛题目---具体题目 D题 天然肠衣搭配问题 天然肠衣(以下简称肠衣)制作加工是我国的一个传统产业,出口量占世界首位。肠衣经过清洗整理后被分割成长度不等的小段(原料),进入组装工序。 传统的生产…...

RG3000网关构建5G LAN智慧工厂智能制造

在工业4.0与智能制造的趋势下,传统制造业正前后往智慧工厂转型升级。在转型过程中,高效、稳定、灵活的网络通信是实现设备互联互通、数据实时交互与智能决策的基础。智联物联RG3000网关,凭借其融合5G通信技术、WiFi6无线传输、边缘计算能力与…...

Rust语言学习教程、案例与项目实战指引

Rust语言学习教程、案例与项目实战指引 一、入门教程 (一)官方核心文档 Rust官方网站的核心文档是踏上Rust学习征程的绝佳起点。这里犹如一座知识宝库,涵盖了Rust编程时可能遇到的几乎所有内容,从基础语法到高级特性,一…...

通信应用高速模数转换器ADC

在5G通信、医疗成像、航空航天及工业自动化等关键领域,高速ADC模数转换器作为信号链的“心脏”,其性能直接决定了系统的精度与效率。然而,如何精确测试高速ADC的动态参数、优化设计验证流程、应对复杂应用场景的挑战,始终是工程师…...

大模型测评选型指南:企业级大模型测评实战解析

在当今数字化飞速发展的时代,AIGC大模型如雨后春笋般涌现,为各行业带来创新变革的同时,其安全性也成为了不容忽视的关键问题。随着人工智能技术加速落地,AIGC大模型的安全合规已成为产业发展的核心命题。那么,企业该如…...

微信小程序学习目录

个人简介 👨‍💻‍个人主页: 魔术师 📖学习方向: 主攻前端方向,正逐渐往全栈发展 🚴个人状态: 研发工程师,现效力于政务服务网事业 🇨🇳人生格言&…...

AG32 DMAC实现内部MCU与FPGA通信【知识库】

一、简介 DMAC是独立于MCU和FPGA之外的外设,连接到AHB总线,可通过寄存器配置实现直接内存存取。通过AHB总线实现MCU与FPGA进行高性能通信。理论最高传输速率可达 bus_clock * 32 168MHz * 32 5376Mbps 5.25Gbps,超频到336MHz的形况下&…...

webrtc初了解

1. webrtc的简介 一、WebRTC 是什么? Web Real-Time Communication(网页实时通信),是浏览器原生支持的实时音视频通信技术,无需安装插件或客户端,可直接在浏览器之间实现点对点(P2P&#xff09…...

[STM32学习笔记(九)]CubeMX项目使用系统定时器SysTick的中断服务函数进行定时

有很多文章说明了由于HAL_Delay()函数的本质是系统定时器计数,通过全局变量uwTick的不断增加实现的比较延迟。调用HAL_Delay()函数会阻塞其他工作,因此在外设ISR进程调用该延迟时,要特别小心。 因此,现在考虑,既然系统…...

5G 核心网 NGAP UE-TNL 偶联和绑定

引言: 在 5G 核心网架构中,NG 接口作为连接无线接入网(RAN)与核心网(5GC)的关键纽带,承载着大量控制面信令交互。NG 应用协议(NGAP)作为 NG 接口上的核心协议,负责管理 RAN 与 5GC 之间的通信,其中 UE - TNL(User Equipment - Transport Network Layer)偶联和绑定…...

性能测试怎么做?方法、流程与核心要点解析

目录 一、性能测试核心方法论 性能测试五大类型解析 七项关键性能指标 二、性能测试实施流程 需求分析阶段 测试设计阶段 环境搭建要点 测试执行策略 三、性能问题定位与优化 常见瓶颈识别 优化实战案例 四、测试报告编写规范 核心内容框架 数据可视化建议 五、企…...

将ipynb文件转换为markdown格式文件

文章目录 将ipynb文件转换为markdown格式文件nbconvert 包安装nbconvert 使用 将ipynb文件转换为markdown格式文件 有时候,我们需要把Jupyter notebook的.ipynb格式文件转换为markdown格式.md,便于使用。 那么,我们可以通过安装nbconvert包&a…...

Vulnhub_Zico2_wp

一、信息收集 1、主机发现 arp-scan -l 2、端口扫描 nmap -sS -sV 192.168.66.144 nmap -p- -Pn -sC -sV -n 192.168.66.144 whatweb -v 192.168.66.144 这里开放了3个端口,先80端口拿去目录,然后测试下22端口有没有什么未授权之类的,然后…...

【玩转腾讯混元大模型】腾讯混元大模型AIGC系列产品深度体验

【玩转腾讯混元大模型】腾讯混元大模型AIGC系列产品深度体验 腾讯推出的系列AI产品:混元大模型、大模型图像创作引擎、大模型视频创作引擎、腾讯元宝,共同构成了一个强大的AI生态系统;凭借腾讯自研的大规模预训练技术和先进的自然语言处理、计…...

品优购项目(HTML\CSS)

项目效果可访问 http://zhousunyu.3vdo.club 查看 主页 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><titl…...

Attention Is All You Need论文阅读笔记

Attention is All You Need是如今机器学习研究者必读的论文&#xff0c;该文章提出的Transformer架构是如今很多机器学习项目的基础&#xff0c;说该文章极大推动了机器学习领域的研究也不为过。 但这么重要&#xff0c;也是必读的文章对初学者来说其实并不友好&#xff0c;很多…...

深入理解设计模式之中介者模式

深入理解设计模式之&#xff1a;中介者模式&#xff08;Mediator Pattern&#xff09; 一、什么是中介者模式&#xff1f; 中介者模式&#xff08;Mediator Pattern&#xff09;是一种行为型设计模式。它通过引入一个中介对象&#xff0c;来封装一组对象之间的交互&#xff0…...

OpenCV 图像像素的读写操作

一、知识点 1、在OpenCV中&#xff0c;一切图像皆Mat。 2、对图像像素的读写操作&#xff0c;就是对Mat元素的遍历与访问。 3、对Mat使用数组方式遍历与访问。 (1)、函数声明: template<typename _Tp> inline_Tp & Mat::at(int i0, int i1) (2)、参数说明:…...

【前端】【Vue3】vue3性能优化总结

第一章 Vue3性能优化概述 1.1 Vue3性能提升背景 1.1.1 Vue2性能瓶颈分析 1. 响应式原理的局限性 Object.defineProperty 的缺陷&#xff1a;Vue2 使用 Object.defineProperty 来实现响应式。这个方法只能劫持对象的属性&#xff0c;对于新增或删除属性无法自动响应。例如&a…...

如何制作全景VR图?

全景VR图&#xff0c;特别是720度全景VR&#xff0c;为观众提供一种沉浸式体验。 全景VR图能够捕捉场景的全貌&#xff0c;还能将多个角度的图片或视频无缝拼接成一个完整的全景视角&#xff0c;让观众在虚拟环境中自由探索。随着虚拟现实&#xff08;VR&#xff09;技术的飞速…...

动态防御新纪元:AI如何重构DDoS攻防成本格局

1. 传统高防IP的静态瓶颈与成本困境 传统高防IP依赖预定义规则库&#xff0c;面对SYN Flood、CC攻击等威胁时&#xff0c;常因规则更新滞后导致误封合法流量。例如&#xff0c;某电商平台曾因静态阈值过滤误封20%的订单接口流量&#xff0c;直接影响营收。以下代码模拟传统方案…...