【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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/85112.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/85112.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/85112.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【開發心得】AstrBot對接飛書失敗的問題探究

飛書與AstrBot的集成使用中,偶爾出現連接不穩定的現象。盡管不影響核心功能,但為深入探究技術細節并推動后續優化,需系統性記錄該問題。先從底層通信機制入手,分析連接建立的邏輯與數據交互流程。基于實際現象,明確問題發生的具體場景和表現特征,進而梳理潛在影響因素,為…

Spring Boot 3.5.0中文文檔上線

Spring Boot 3.5.0 中文文檔翻譯完成,需要的可收藏 傳送門:Spring Boot 3.5.0 中文文檔

7.atlas安裝

1.服務器規劃 軟件版本參考: https://cloud.google.com/dataproc/docs/concepts/versioning/dataproc-release-2.2?hlzh-cn 由于hive3.1.3不完全支持jdk8,所以將hive的版本調整成4.0.1。這個版本沒有驗證過,需要讀者自己抉擇。 所有的軟件都安裝再/op…

c# 獲取電腦 分辨率 及 DPI 設置

using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Runtime.InteropServices;/// <summary> /// 這個可以 /// </summary> class Program {static void Main(){//設置DPI感知try{SetProcessDpiAwareness(…

LangChain表達式(LCEL)實操案例1

案例1&#xff1a;寫一篇短文&#xff0c;然后對這篇短文進行打分 from langchain_core.output_parsers import StrOutputParser from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder from langchain_core.runnables import RunnableWithMessageHist…

OleDbParameter.Value 與 DataTable.Rows.Item.Value 的性能對比

OleDbParameter.Value 與 DataTable.Rows.Item.Value 的性能對比 您提到的兩種賦值操作屬于不同場景&#xff0c;它們的性能和穩定性取決于具體使用方式。下面從幾個維度進行分析&#xff1a; 1. 操作本質對比 &#xff08;1&#xff09;OleDbParameter.Value 用途&#xf…

【Opencv+Yolo】Day2_圖像處理

目錄 一、圖像梯度計算 圖像梯度-sobal算子&#xff1a; Scharr&#xff1a;權重變化更大&#xff08;線條更加豐富&#xff0c;比Sobel更加細致捕捉更多梯度信息&#xff09; Laplacian算子&#xff1a;對噪音點敏感&#xff08;可以和其他一起結合使用&#xff09; 二、邊…

STM32通過rt_hw_hard_fault_exception中的LR寄存器追溯程序問題?

1. 問題現象 程序運行導致rt_hw_hard_fault_exception 如圖 顯示錯誤相關代碼 struct exception_stack_frame {uint32_t r0;uint32_t r1;uint32_t r2;uint32_t r3;uint32_t r12; uint32_t lr; // 鏈接寄存器 (LR)uint32_t pc; // 程序計數器 (PC)uint32_t psr; // 程序狀態…

Mac安裝配置InfluxDB,InfluxDB快速入門,Java集成InfluxDB

1. 與MySQL的比較 InfluxDBMySQL解釋BucketDatabase數據庫MeasurementTable表TagIndexed Column索引列FieldColumn普通列PointRow每行數據 2. 安裝FluxDB brew update默認安裝 2.x的版本 brew install influxdb查看influxdb版本 influxd version # InfluxDB 2.7.11 (git: …

【spring】spring中的retry重試機制; resilience4j熔斷限流教程;springboot整合retry+resilience4j教程

在調用三方接口時&#xff0c;我們一般要考慮接口調用失敗的處理&#xff0c;可以通過spring提供的retry來實現&#xff1b;如果重試幾次都失敗了&#xff0c;可能就要考慮降級補償了&#xff1b; 有時我們也可能要考慮熔斷&#xff0c;在微服務中可能會使用sentinel來做熔斷&a…

(21)量子計算對密碼學的影響

文章目錄 2??1?? 量子計算對密碼學的影響 &#x1f30c;&#x1f50d; TL;DR&#x1f680; 量子計算&#xff1a;密碼學的終結者&#xff1f;? 量子計算的破壞力 &#x1f510; Java密碼學體系面臨的量子威脅&#x1f525; 受影響最嚴重的Java安全組件 &#x1f6e1;? 后…

經營分析會,財務該怎么做?

目錄 一、業績洞察&#xff1a;從「現象描述」到「因果分析」 1.分層拆解 2.關聯驗證 3.根因追溯 二、預算管理&#xff1a;從「剛性控制」到「動態平衡」 1.分類管控 2.滾動校準 3.價值評估 三、客戶與市場&#xff1a;從「交易記錄」到「價值評估」 1.價值分層 2.…

進階智能體實戰九、圖文需求分析助手(ChatGpt多模態版)(幫你生成 模塊劃分+頁面+表設計、狀態機、工作流、ER模型)

?? 基于 ChatGPT 多模態大模型的需求文檔分析助手 本文將介紹如何利用 OpenAI 的 GPT-4o 多模態能力,構建一個智能的需求文檔分析助手,自動提取功能模塊、菜單設計、字段設計、狀態機、流程圖和 ER 模型等關鍵內容。 一、?? 環境準備 在開始之前,請確保您已經完成了基礎…

圖書管理系統的設計與實現

湖南軟件職業技術大學 本科畢業設計(論文) 設計(論文)題目 圖書管理系統的設計與實現 學生姓名 學生學號 所在學院 專業班級 畢業設計(論文)真實性承諾及聲明 學生對畢業設計(論文)真實性承諾 本人鄭重聲明:所提交的畢業設計(論文)作品是本人在指導教師的指導下,獨…

直線模組在手術機器人中有哪些技術挑戰?

手術機器人在現代醫療領域發揮著越來越重要的作用&#xff0c;直線模組作為其關鍵部件&#xff0c;對手術機器人的性能有著至關重要的影響。然而&#xff0c;在手術機器人中使用直線模組面臨著諸多技術挑戰&#xff0c;具體如下&#xff1a; 1、?高精度要求?&#xff1a;手術…

技術-工程-管用養修保-智能硬件-智能軟件五維黃金序位模型

融智學工程技術體系&#xff1a;五維協同架構 基于鄒曉輝教授的框架&#xff0c;工程技術體系重構為&#xff1a;技術-工程-管用養修保-智能硬件-智能軟件五維黃金序位模型&#xff1a; math \mathbb{E}_{\text{技}} \underbrace{\prod_{\text{Dis}} \text{TechnoCore}}_{\…

InnoDB引擎邏輯存儲結構及架構

簡化理解版 想象 InnoDB 是一個高效運轉的倉庫&#xff1a; 核心內存區 (大腦 & 高速緩存 - 干活超快的地方) 緩沖池 Buffer Pool (最最核心&#xff01;)&#xff1a; 作用&#xff1a; 相當于倉庫的“高頻貨架”。把最常用的數據&#xff08;表數據、索引&#xff09;從…

貧血模型與充血模型:架構設計的分水嶺

在企業級應用的架構設計中&#xff0c;貧血模型和充血模型一直是架構師們爭論的熱點話題。兩者背后分別代表著“事務腳本模式”和“領域模型模式”兩種截然不同的設計思想。而理解這兩者的差異&#xff0c;有助于開發者根據實際業務場景做出更合理的架構決策。 貧血模型&#…

Linux的調試器--gbd/cgbd

1.引入 #include <stdio.h> int Sum(int s, int e) {int result 0;for(int i s; i < e; i){result i;}return result; } int main() {int start 1;int end 100;printf("I will begin\n");int n Sum(start, end);printf("running done, result i…

PPIO × AstrBot:多平臺接入聊天機器人,開啟高效協同 | 教程

在消息平臺接入專屬聊天機器人&#xff0c;能快速生成精準答案&#xff0c;與項目管理、CRM等系統集成后&#xff0c;機器人還能根據任務進展自動建群、推送進度提醒&#xff0c;并精準相關人員&#xff0c;實現信息的高效傳遞。 AstrBot 是一個多平臺聊天機器人及開發框架&…