arm平臺編譯so文件回顧

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔

文章目錄

  • 前言
  • 一、幾個點
  • 二、回顧過程
    • 1.上來就執行Makefile
    • 2.編譯第三方開源庫.a文件
      • 2.1 build.sh腳本
      • 2.2?Makefile
    • 3.最終編譯
  • 三、其它知識點
  • 總結


前言

提示:這里可以添加本文要記錄的大概內容:

在編譯arm平臺so文件時,完成了以下的幾個點:

1、根據第三方開源的build.sh文件編譯第三方開源庫,至于build.sh文件怎么寫,大概是看開源倉的README文件吧。

2、寫了一個MakeFile文件并運行編譯了.a文件。最近查資料的時候獲取到一個知識點就是,其實.a就是所有.o文件的集合。

3、根據子文件夾Makefile文件編譯子文件夾.a文件。

4、解決編譯過程中的多個問題


一、幾個點

1、目標

在arm機器上編譯出arm平臺上可用的so文件

2、機器系統

[root@ncn4a-mapopenservice-34-12-242 ~]# uname -a
Linux ncn4a-mapopenservice-34-12-242 4.19.36-vhulk1907.1.0.h1393.eulerosv2r8.aarch64 #1 SMP Thu Jan 5 17:52:22 UTC 2023 aarch64 aarch64 aarch64 GNU/Linux

3、build.sh和Makefile領悟

接前言。現在理解了build和Makefile的區別。源于我將makefile的文件內容放在了build.sh腳本中。然后感覺突然恍然大悟。

Makefile文件是用來編譯代碼的。里面是有CXXFLAGS,就是將.c//cpp文件編譯成.a文件。

OBJ關鍵詞就要編譯成.a還是.so文件格式。

而build.sh文件其實就是linux指令集合文件,里面寫了編譯庫的很多指令。其中就包括調用makefile的一步,即調用make指令。

所以build.sh和makefile是有比較大的區別的。

而且自己寫的代碼只需要編寫Makefile就可以了,即只需要Makefile就可以了。因為用不到第三方開源庫的.configure、make install。只需要一個make就可以了,所以寫個make就可以執行了。

二、過程回顧

1.上來就執行Makefile

拿到studio_compile工程后,以為是直接執行build就可以了。但是執行時報了一個文件格式不對的錯誤

[2023-12-06 16:38:38]  [root@ncn4a-mapopenservice-34-12-242 compile_wrapper]# ll
[2023-12-06 16:38:39]  total 16
[2023-12-06 16:38:39]  drwxrwxr-x 2 root root 4096 Apr 27  2023 include
[2023-12-06 16:38:39]  -rw-rw-r-- 1 root root 1926 Apr 27  2023 Makefile
[2023-12-06 16:38:39]  drwxrwxr-x 2 root root 4096 Apr 27  2023 src
[2023-12-06 16:38:39]  drwxrwxr-x 2 root root 4096 Apr 27  2023 vs
[2023-12-06 16:38:39]  [root@ncn4a-mapopenservice-34-12-242 compile_wrapper]# make -jm98
[2023-12-06 16:38:47]  g++ -Werror=return-type -std=c++0x -Wl,-z,relro,-z,now,-z,noexecstack -D_FORTIFY_SOURCE=2 -O2 -s -ftrapv -fPIC -fstack-protector-all -w -c -shared -o -D__STDC_LIMIT_MACROS -Dlinux -I. -I./include -I../model/include -I../common/include -I../compiler/include -I../configurator/include -I../operation/include -I../preprocessor/include -I../pbencoder/include -I../../../3rd/gdal/include/linux -I../../../3rd/gdal/src/libtiff\include -I../../../3rd/boost/include -I../../../3rd/jni/include/linux -I../../../3rd/protobuf/include -I../../../3rd/sqlite/include -I../../../3rd/zlib/include/linux -I../../../platform/HuaweiSecureC/include  src/com_huawei_mobilegis_data_studiocompile_engine_NativeEngine.cpp -o src/com_huawei_mobilegis_data_studiocompile_engine_NativeEngine.o
[2023-12-06 16:38:47]  g++ -Werror=return-type -std=c++0x -Wl,-z,relro,-z,now,-z,noexecstack -D_FORTIFY_SOURCE=2 -O2 -s -ftrapv -fPIC -fstack-protector-all -w -c -shared -o -D__STDC_LIMIT_MACROS -Dlinux -I. -I./include -I../model/include -I../common/include -I../compiler/include -I../configurator/include -I../operation/include -I../preprocessor/include -I../pbencoder/include -I../../../3rd/gdal/include/linux -I../../../3rd/gdal/src/libtiff\include -I../../../3rd/boost/include -I../../../3rd/jni/include/linux -I../../../3rd/protobuf/include -I../../../3rd/sqlite/include -I../../../3rd/zlib/include/linux -I../../../platform/HuaweiSecureC/include  src/CompileLayerWrapper.cpp -o src/CompileLayerWrapper.o
[2023-12-06 16:38:47]  g++ -Werror=return-type -std=c++0x -Wl,-z,relro,-z,now,-z,noexecstack -D_FORTIFY_SOURCE=2 -O2 -s -ftrapv -fPIC -fstack-protector-all -w -c -shared -o -D__STDC_LIMIT_MACROS -Dlinux -I. -I./include -I../model/include -I../common/include -I../compiler/include -I../configurator/include -I../operation/include -I../preprocessor/include -I../pbencoder/include -I../../../3rd/gdal/include/linux -I../../../3rd/gdal/src/libtiff\include -I../../../3rd/boost/include -I../../../3rd/jni/include/linux -I../../../3rd/protobuf/include -I../../../3rd/sqlite/include -I../../../3rd/zlib/include/linux -I../../../platform/HuaweiSecureC/include  src/ParseJNIObj.cpp -o src/ParseJNIObj.o
[2023-12-06 16:38:47]  g++ -Wl,-z,relro,-z,now,-z,noexecstack -D_FORTIFY_SOURCE=2 -O2 -s -ftrapv -fPIC -fstack-protector-all -static-libstdc++ -shared -o libcompile_wrapper.so ./src/com_huawei_mobilegis_data_studiocompile_engine_NativeEngine.o ./src/CompileLayerWrapper.o ./src/ParseJNIObj.o  -L../../../build/lib/linux -lcompiler -lconfigurator -lpreprocessor -lpbencoder -loperation -lcommon -L../../../3rd/gdal/lib/linux -lgdal -lgeos_c -lgeos -lproj -ljson-c -L../../../3rd/boost/lib/linux -lboost_serialization -lboost_filesystem -lboost_system -lboost_thread -L../../../3rd/protobuf/lib/linux -lprotobuf -L../../../3rd/sqlite/lib/linux/ -lsqlite3 -L../../../3rd/zlib/lib/linux/ -lz -L../../../3rd/gdal/src/libtiff/lib -ltiff -L../../../platform/HuaweiSecureC/lib/linux/ -lsecurec -ldl -lpthread
[2023-12-06 16:39:02]  /usr/bin/ld:../../../3rd/gdal/lib/linux/libgdal.a: file format not recognized; treating as linker script
[2023-12-06 16:39:02]  /usr/bin/ld:../../../3rd/gdal/lib/linux/libgdal.a:1: syntax error
[2023-12-06 16:39:02]  collect2: error: ld returned 1 exit status
[2023-12-06 16:39:02]  make: *** [Makefile:43: all] Error 1

即這一條:

 /usr/bin/ld:../../../3rd/gdal/lib/linux/libgdal.a: file format not recognized; treating as linker script

然后就查看一下libgdal.a文件格式,使用file (filename)指令

[2023-12-06 17:41:48]  [root@ncn4a-mapopenservice-34-12-242 linux]# file libgdal.a 
[2023-12-06 17:41:58]  libgdal.a: ASCII text
[2023-12-06 17:41:58]  [root@ncn4a-mapopenservice-34-12-242 linux]# timed out waiting for input: auto-logout

這個顯示情況其實還看不出來文件格式。這個ACII text文件其實是因為.a文件在windows環境下解壓導致文件格式出問題了。但是其實正常的,也會是x86的格式,不是arm的格式。總而言之,就是報錯格式不對。

這個文件是第三方開源庫靜態庫文件,所以需要編譯第三方開源靜態庫。

其實后來按照心哥的說法,即便格式沒有變成ASCII碼也是需要重新編譯第三方開源庫的,因為平臺變了,之前的.a文件是x86格式的。

這邊不得不吐槽,上傳到git上的.a文件真是一點用沒有啊。

2、編譯第三方開源庫.a文件

先后編譯boost庫、protobuf、sqlite、zlib、gdal庫。其中有兩個點需要單獨領出來看。一個就是gdal庫,還有一個就是沒有Makefile然后我自己寫的makefile文件編譯的。

先說gdal庫。gdal需要依賴tiff庫、json-c庫、geos庫、proj庫,最后才是安裝gdal庫。這邊也是這次才理解的就是。就是對于這幾個庫,自己感覺是編譯,其實也是在機器上安裝這個庫。可以用-- v查看版本號的。

然后這幾個開源庫用的build.sh腳本編譯的。

2.1 build.sh

build.sh基本格式就是以下形式

????????????????????????PREFIX_INC_PATH=$(cd?"$(dirname?"$0")";pwd)? ? ? ? //獲取當前路徑

git下載備注
解壓
更改文件夾名(可選)可選
進入含有configure文件的文件夾中
執行./configure--prefix=【】,//設置安裝路徑
--enable-xxx? /? ?--disable-xxx不懂
--with-xxx? /? --without-xxx不懂
--build=arm-linux? //設置編譯環境國產arm機器需要設置平臺環境,不然會configure失敗,導致build.sh失敗

SQLITE3_CFLAGS=路徑

不懂

SQLITE3_LIBS=路徑 -lsqlite3

不懂

sh?autogen.sh /?autoreconf

不懂,但是要安裝autoconf全家桶,可以參考本人帖子
make -j8
make install
移動OBJ文件可選
【完成】

2.2 Makefile

Makefile的格式大概如下

CXXFLAGS=

用于將.c或.cpp文件編譯成.o文件,編譯格式為

$(CXX) $(CXXFLAGS) $*.cpp -o $@

CXX=CXX = xxx指定編譯器

搜到這個帖子說的比較詳細:Linux Makefile入門總結-CSDN博客

看完這個貼子,增加了對以下幾個知識點的了解

元素說明備注

目標文件 : 依賴文件

[TAB]命令

[TAB]:是你鍵盤左邊tab鍵
-c-c 是生成 .o 文件的必要參數!gcc -c main.c -o main.o
?.PHONY: clean用來屏蔽同名clean的文件夾或文件

=?:變量(可修改)

+=?:追加

:=?:常量(不可修改)

TARGET = test

CXX := g++

$(TARGET)? ? ? ?#?相當于C語言的宏定義
%c、%cpp、%o?隱含規則:?任意的.c 或 任意的.cpp 或 任意的.o使用%c 或 %cpp 或 %o 或 %h 時,優先加點'.'使用,如:%.c、%.cpp、%.o、%.h
*.c、*.cpp、*.o所有的.c 或 所有的.cpp 或 所有的.o
$^

所有的依賴文件

依賴文件:我要做這個操作,依賴哪些東西

$(TARGET): ?$(OBJ) ????????$(CXX) $^ -o $@
$<所有依賴文件的第一個文件(應該也是最匹配的一個文件)%.o: %cpp ?$(CXX) ????????$(CXXFLAGS) $< -o $@
$@

所有的目標文件

目標文件:我要做這個操作,要生成的東西;

CXXFLAGS

CXXFLAGS = -c -Wall

類似于宏替換

SRC = $(wildcard?*.cpp)獲取項目路徑下的所有.cpp源文件
OBJ = $(patsubst %.cpp, %.o, $(SRC))?根據源文件鏈接成 .o 文件wildcard 和?patsubst 是Makefile函數的用法
-wall?編譯后顯示所有警告Makefile 中 -g、-o、-c、-f 、-D、-Wall、-L、含義 | 碼農家園

這個帖子絕佳,搞明白很多之前的疑問,贊!Makefile 中 -g、-o、-c、-f 、-D、-Wall、-L、含義 | 碼農家園

3、最終編譯

繼續回顧流程,顯示用各個開源庫的build.sh腳本把各個開源庫編譯一遍。再把子文件夾用Makefile編譯一遍,這個上面的帖子也說了,每個子文件夾都有一個Makefile

這其中還有一個很奇怪的一個點,就是工程寫了一個build.sh腳本,是進入每個子文件夾分別執行Makefile,這個也是一個知識點。但這不是重點,重點是用這個build.sh腳本執行編譯時,過程中會因為MobaXterm出現network斷開導致編譯失敗,所以我是對子文件夾單獨編譯的。可以編好。就很奇怪。

到此第三方開源庫、子文件的靜態庫都編好了。其中過程中遇到好幾個問題,通過百度都解決了,也記錄在自己的文章中了。報錯處理集-CSDN博客,現在就開始編譯最終的so文件了。

這其中還有一個知識點就是,其實我之前理解的所謂交叉編譯環境是在x86機器上安裝檢查編譯工具。但是過程中問了心哥知道其實我用的這個歐拉系統是arm環境,所以交叉編譯是不是只能用arm機器呢,這個問題留存解決。

解釋:百度了一下,理解了,意思就是交叉編譯是因為目標平臺可能不支持編譯或者資源不夠,跨平臺編譯就叫交叉編譯。如果像我這樣就不算交叉編譯了吧。

【百度百科:

一個經常會被問到的問題就是,“既然我們已經有了主機編譯器,那為什么還要交叉編譯呢?”其實答案很簡單。有時是因為目的平臺上不允許或不能夠安裝我們所需要的編譯器,而我們又需要這個編譯器的某些特征;有時是因為目的平臺上的資源貧乏,無法運行我們所需要編譯器;有時又是因為目的平臺還沒有建立,連操作系統都沒有,根本談不上運行什么編譯器。

另一個經常會被問到的問題就是:“既然可以交叉編譯,那還要主機編譯干嗎?”其實答案也很簡單,交叉編譯是不得已而為之!與主機編譯相比,交叉編譯受的限制更多,雖然在理論上我們可以做任何形式的交叉編譯,但事實上,由于受到專利、版權、技術的限制,并不總是能夠進行交叉編譯,尤其是在業余條件下!舉例來說,我們至今無法生成惠普公司專有的som格式的可執行文件,因此我們根本無法做目的平臺為HPPA-HPUX的交叉編譯。來源:交叉編譯_百度百科

還有一點就是這次編譯過程比較復雜,一方面是因為集氣室離線的,很多是要離線安裝的。但是問了心哥,說可以用yum install在線安裝,試了確實可以。這個可能跟是歐拉系統有關。

三、其他知識點

1、這邊還有一個關于x86和arm平臺區別的知識點,找到這篇帖子:https://www.cnblogs.com/kin-zhang/p/15031633.html

2、Makefile里面可以直接把.a換成.so嗎?編譯.a和編譯.so的Makefile有什么區別?

這個需要后面了解下

Makefile鏈接靜態庫.a編譯成動態庫.so_makefile 鏈接.a-CSDN博客

3、linux安裝git的用戶設置

當時準備安裝git拉取代碼的,不過發現并不可行,所以沒有深究下去。后面可以了解下。

4、LIB = ar cr什么意思,未知,后面要了解下


總結

????????對整個編譯過程進行了總結,是有意義的,編成功了。但是經驗不復用應該是不好的,需要把經驗積累下來。突然想起來強哥之前一直說要經驗復用,大概也是指的這個意思吧。

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

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

相關文章

MSSQL存儲過程的功能和用法(簡明扼要)

官方文檔 存儲過程&#xff08;數據庫引擎&#xff09; - SQL Server | Microsoft Learn Transact-SQL 參考&#xff08;數據庫引擎&#xff09; - SQL Server | Microsoft Learn 定義 存儲過程可以用編程語言的方法來類比&#xff0c;有輸入輸出。區別是其使用SQL表達業務…

spring 單元測試 Junit

我是南城余&#xff01;阿里云開發者平臺專家博士證書獲得者&#xff01; 歡迎關注我的博客&#xff01;一同成長&#xff01; 一名從事運維開發的worker&#xff0c;記錄分享學習。 專注于AI&#xff0c;運維開發&#xff0c;windows Linux 系統領域的分享&#xff01; 本…

解決打印機超出字節之使用PHP拆分字符串并保留分隔符

在開發過程中&#xff0c;我們經常需要將一個長字符串拆分成多個片段&#xff0c;并且保留原始字符串中的分隔符。在本篇教程中&#xff0c;我們將使用PHP編寫一個函數來實現這個功能。 首先&#xff0c;讓我們來看一下我們要解決的問題。假設我們有一個長字符串&#xff0c;我…

pywinrm 解析輸出為 dict 格式 字典格式

s winrm.Session(host, auth(username, password))task_folder \RPA\\ # 運行 schtasks 命令來列出任務計劃程序 command schtasks /query /fo csv # command fschtasks /query /fo csv /tn {task_folder} # command fschtasks /query /fo csv /tn "{task_folder}\\…

mapbox使用v3版本,v2的樣式切換不同時間段

創建DayAndNight.js /*** 使用方式* const dayNight new DayAndNight({ map: map // map 地圖對象}) * 修改類型* dayNight.setConfigProperty(value)*/ class DayAndNight {constructor (sdMap) {this.map sdMap.mapthis.initStyle()}// 初始化時添加必要樣式initStyle () {…

刪除計算機用戶時拒絕訪問權限,c盤為什么拒絕訪問 刪除c盤文件需要管理員權限怎么辦...

轉載&#xff1a;??????刪除計算機用戶時拒絕訪問權限,c盤為什么拒絕訪問 刪除c盤文件需要管理員權限怎么辦...-CSDN博客 c盤是電腦中的關鍵位置&#xff0c;存儲著很多系統重要文件&#xff0c;如果電腦出問題一般就是c盤中的文件異常&#xff0c;近日有小伙伴出現這樣…

前端知識筆記(四十一)———nodejs發起http或https請求

http請求 const express require(express) const http require(http)const app express()const loginConfig (token) > {return {hostname: api.test.com,port: 80,path: /test?access_token${token},method: GET} }app.get(/login, (req, res) > {const options …

c++通過serial庫進行上下位機通信

?編輯 風紊 現役大學牲&#xff0c;半退休robomaster視覺隊員 寫在前面 本文章主要介紹的是如何通過開源的serial庫和虛擬串口實現上位機和下位機通信。 需求 假設下位機有這樣一個數據報發送給上位機 struct DataRecv {char start s;TeamColor color TeamColor::Blu…

Premiere Pro 2024 新功能有哪些?視頻剪輯軟件PR2024更新內容及問題修復

PR軟件“基于文本的編輯”中的填充詞檢測與批量刪除功能 “基于文本的編輯”可讓您檢測“呃”和“嗯”填充詞并批量刪除它們&#xff0c;從而使您的轉錄文本更加準確。就像處理停頓一樣&#xff0c;您可以單擊填充詞并將其從序列轉錄文本中刪除。填充詞與語言無關&#xff0c;…

STM32CubeIDE(CUBE-MX hal庫)----RTC時鐘,時鐘實時顯示

系列文章目錄 STM32CubeIDE(CUBE-MX hal庫)----初嘗點亮小燈 STM32CubeIDE(CUBE-MX hal庫)----按鍵控制 STM32CubeIDE(CUBE-MX hal庫)----串口通信 STM32CubeIDE(CUBE-MX hal庫)----定時器 STM32CubeIDE(CUBE-MX hal庫)----藍牙模塊HC-05&#xff08;詳細配置&#xff09; 前言…

【無標題】安裝環境

這里寫目錄標題 清華鏡像加速 安裝cuda11.3 PyTorch 1.10.1https://pytorch.org/get-started/previous-versions/[如果沒有可以點Previous pyTorch Versions&#xff0c;這里面有更多的更早的版本](https://pytorch.org/get-started/locally/) 復制非空文件夾cp: -r not specif…

傳染病傳播速度

題干 R0值是基本傳染數的簡稱&#xff0c;指的是在沒有采取任何干預措施的情況下&#xff0c;平均每位感染者在傳染期內使易感者個體致病的數量。數字越大說明傳播能力越強&#xff0c;控制難度越大。一個人傳染的人的數量可以用冪運算來計算。假設奧密克戎的R0為10&#xff0…

《LeetCode力扣練習》代碼隨想錄——字符串(翻轉字符串里的單詞---Java)

《LeetCode力扣練習》代碼隨想錄——字符串&#xff08;翻轉字符串里的單詞—Java&#xff09; 刷題思路來源于 代碼隨想錄 151. 反轉字符串中的單詞 雙指針 class Solution {public String reverseWords(String s) {char[] results.toCharArray();resultremoveSpace(result);r…

2023-12-05 Qt學習總結2

點擊 <C 語言編程核心突破> 快速C語言入門 Qt學習總結 前言五 Hello Qt!六 Qt控件和事件七 Qt信號和槽八 Qt自定義信號和槽總結 前言 要解決問題: 學習qt最核心知識, 多一個都不學. 五 Hello Qt! 現在我們已經有了一個空窗口工程, 傳統上, 我們要實現一個"Hello …

(三潮來襲)探尋2023年科技變革潮流與2024年前瞻展望

2023年對于IT行業來說是一個動蕩而又充滿變革的一年。隨著世界逐漸走出前幾年的挑戰&#xff0c;企業逐漸復蘇&#xff0c;但這個行業仍然在經歷著激烈的變革。在這個時候&#xff0c;我們看到了一些引人注目的技術變化和未來的趨勢。 一、2023年回顧 關鍵詞&#xff1a;Chat…

構建Servlet項目流程

第一步&#xff1a;創建maven項目 部分基礎 依賴的模板基礎部分如下 maven-archetype-quickstart: 這是最基本的Archetype&#xff0c;它創建一個包含簡單Java類和單元測試的項目。 maven-archetype-webapp: 這個Archetype創建一個簡單的Java web應用&#xff0c;包括一個serv…

【C++】算法庫(批量操作、搜索操作)

C算法庫 文章目錄 C算法庫批量操作for_eachfor_each_n 搜索操作all_of ,any_of ,none_offind, find_if, find_if_notfind_endstd::find_first_ofadjacent_findcount, count_ifequalsearchsearch_n 算法庫提供大量用途的函數&#xff08;例如查找、排序、計數、操作&#xff09;…

微信小程序 - PC端選擇ZIP文件

微信小程序 - PC端選擇文件 分享代碼片段場景分析解決思路附魔腳本chooseMediaZip 選擇附魔后的ZIP文件相關方法測試方法 參考資料 分享代碼片段 不想聽廢話的&#xff0c;直接看代碼。 https://developers.weixin.qq.com/s/UL9aojmn7iNU 場景分析 如果你的微信小程序需要選…

TypeScript入門實戰筆記 -- 開篇 為什么要選擇 TypeScript ?

typescript 在線編輯器http://typescript.p2hp.com/play?#code/JYOwLgpgTgZghgYwgAgJIFUDO1Uhge2QG8AoZc5YAEwC5kQBXAWwCNoBuMikOJiOzGCigA5pwrI4ANzhg4UAPwChozgF8SmmAxAIwwfCGRYcefAAoADlHyXMdDNii4CASmJdyCQ5nwAbCAA6P3wRKxs7ABpkAHJrW0wY1xINEhNnM3MiSlpkAEZonj46GIBrROQ1…

openEuler學習05-kernel升級

周末沒事&#xff0c;嘗試下openEuler的kernel升級 [rootlocalhost ~]# more /etc/os-release NAME"openEuler" VERSION"20.03 (LTS-SP3)" ID"openEuler" VERSION_ID"20.03" PRETTY_NAME"openEuler 20.03 (LTS-SP3)" ANSI_…