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

news2025/6/2 15:29:23

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 = sofile
      depend_output = sofile
      output_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 = sofile
      depend_output = sofile
      output_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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2393951.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

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

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

基于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无线传输、边缘计算能力与…

webrtc初了解

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

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

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

将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生态系统;凭借腾讯自研的大规模预训练技术和先进的自然语言处理、计…

Attention Is All You Need论文阅读笔记

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

如何制作全景VR图?

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

Flask与PostgreSQL交互教程

目录 1. 项目结构2. 环境准备2.1 安装依赖2.2 使用Docker启动PostgreSQL 3. 数据库配置3.1 环境变量配置3.2 数据库连接配置 4. 定义数据库模型5. 实现API接口5.1 创建用户5.2 获取所有用户5.3 获取单个用户5.4 更新用户5.5 删除用户 6. 运行应用7. API测试7.1 创建用户7.2 获取…

XJTU-SY轴承振动数据集的json自封装

1.最终形式的形式 不用再去翻文档找对应的故障类型,采样率等信息了,所有的信息自包含在.json文件里,15个测试例,一个测试例对应一整个.json文件。 {"dataset": {"name": "XJTU-SY_Bearing_Datasets&quo…

Spring AI 系列2: Advisors增强器简介

一、Advisors简介 1.1 Advisors定义 Advisors 是在 AI 应用程序中处理请求和响应的拦截器。我们可以使用它们为提示流程设置额外的功能。例如,可以建立聊天历史、排除敏感词或为每个请求添加额外的上下文。 Spring AI的Advisor,本质上是一个拦截…

通过Func实现飞书应用通知消息加急处理

前言 在现代企业运作中,及时响应告警信息对保障系统的稳定性和业务的连续性至关重要。随着业务的数字化转型,越来越多的企业依赖于复杂的技术架构,这使得故障和异常事件的及时处理变得愈发重要。传统的告警通知方式往往存在响应不及时、信息…

【目标检测】【AAAI-2022】Anchor DETR

Anchor DETR: Query Design for Transformer-Based Object Detection 锚点DETR:基于Transformer的目标检测查询设计 论文链接 代码链接 摘要 在本文中,我们提出了一种基于Transformer的目标检测新型查询设计。此前的Transformer检测器中&am…

智慧工厂整体解决方案

该方案围绕智能工厂建设,阐述其基于工业 4.0 和数字化转型需求,通过物联网、大数据、人工智能等技术实现生产自动化、数据化管理及联网协同的特点。建设步骤包括评估现状、设定目标、制定方案、测试调整、实施计划及持续改进,需整合 MES、ERP 等软件系统与传感器、机器人等硬…

秋招Day12 - 计算机网络 - TCP

详细说一下TCP的三次握手机制 TCP的三次握手机制是为了在两个主机之间建立可靠的连接,这个机制确保两端的通信是同步的,并且在开始传输数据前,双方都做好了要通信的准备。 说说SYN的概念? SYN 是 TCP 协议中用来建立连接的一个标…