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

linux下编译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

相关推荐
tiger11910 分钟前
大学专业解读——电气,自动化,仪器
运维·自动化·高考·电气·专业·仪器
来一杯龙舌兰2 小时前
【Kubernetes】从零搭建K8s集群:虚拟机环境配置全指南(DNS/网络/防火墙/SELinux全解析一站式配置图文教程)
linux·网络·kubernetes
穆易青2 小时前
2025.06.20【pacbio】|使用Snakemake构建可重复的PacBio全基因组甲基化分析流程
java·运维·服务器
网硕互联的小客服2 小时前
高并发下分布式数据库性能下降的解决方法
数据库·分布式
l and2 小时前
鸿蒙:启动本地 http-server 加载 h5 游戏
http·游戏·harmonyos
远方16093 小时前
59-Oracle 10046事件-知识准备
大数据·数据库·sql·oracle·database
A.A呐3 小时前
【Linux第四章】gcc、makefile、git、GDB
linux·c语言·开发语言·c++·git
努力成为DBA的小王3 小时前
CVE-2024-6387漏洞、CVE-2025-26465漏洞、CVE-2025-26466漏洞 一口气全解决
运维·服务器
静听山水3 小时前
PostgreSQL/Hologres 外部数据包装器系统表 pg_foreign_data_wrapper 详解
数据库·postgresql
神洛华3 小时前
SQL Server基础语句1:基础查询、数据筛选 / 排序 、分组聚合
数据库·sql