當前位置:首頁 » 編程軟體 » arm64編譯優化

arm64編譯優化

發布時間: 2022-11-30 09:00:40

1. iOS armv7, armv7s, arm64區別與應用32位、64位配置

如果你不能確定庫是否支持了arm64,可以在cmd模式下用file命令來檢查一下庫文件:

armv7,armv7s和arm64,i386,x86_64這些都代表什麼?

__Arm處理器,因為其低功耗和小尺寸而聞名,幾乎所有的手機處理器都基於arm,其在嵌入式系統中的應用非常廣泛,它的性能在同等功耗產品中也很出色。

Armv6、armv7、armv7s、arm64都是arm處理器的指令集,所有指令集原則上都是向下兼容的,如iPhone4S的CPU默認指令集為armv7指令集,但它同時也兼容armv6指令集,只是使用armv6指令集時無法充分發揮其性能,即無法使用armv7指令集中的新特性,同理,iPhone5的處理器標配armv7s指令集,同時也支持armv7指令集,只是無法進行相關的性能優化,從而導致程序的執行效率沒那麼高。

現在回歸到正題,如何製作一個「沒有問題」的.a靜態庫,通過以上信息了解到,當我們做App的時候,為了追求高效率,並且減小包的大小,Build Active Architecture Only設置成YES,Architectures按Xcode默認配置就可以,因為arm64向前兼容。但製作.a靜態庫就不同了,因為要保證兼容性,包括不同iOS設備以及模擬器運行不出錯,所以結合當前行業情況,要做到最大的兼容性。
ValidArchitectures設置為:armv7|armv7s|arm64|i386|x86_64
Architectures設置不變(或根據你需要): armv7|arm64
然後分別選擇iOS設備和模擬器進行編譯,最後找到相關的.a進行合包:

使用lipo -create 真機庫.a的路徑 模擬器庫.a的的路徑 -output 合成庫的名字.a ,這樣就製作了一個通用的靜態庫.a。
製作動態、靜態庫詳情可以參考 【鏈接】

部份資源 鏈接

2. 如何對靜態庫編譯增加arm64的支持

之前app用到的libmp3lame.a靜態庫,也要支持64位的模擬器(x86_64)和64位的真機(arm64)指令集。需要重新編譯

查閱了下資料,按照如下步驟,並做了些注釋和改動

1.http。//sourceforge。net/projects/lame/files/lame/3.99/ 下載lame的最新版本解壓到一個文件夾里例如 lame,全路徑如下/Users/8wm/Desktop/lame

2.下載build的腳本,我這里使用的是國外一個朋友的分享

https。//github。com/kewlbear/lame-ios-build

下載之後得到lame-build.sh拷貝到文件夾/Users/8wm/Desktop/lame

3.用bbedit或者其他編輯器打開這個腳本,按照注釋修改

4.打開Terminals,

輸入

cd /Users/8wm/Desktop/lame

chmod 777 lame-build.sh

sudo -s#

輸入系統密碼

./lame-build.sh

開始編譯,編譯完成之後。生成fat-lame目錄和thin-lame目錄,分別存放合並所有指令集的靜態庫,以及各指令集的靜態庫.

根據所需, lame.h和libmp3lame.a文件到project里,就可以正常使用了。

可以使用命令行,查看換個庫支持的指令集。

lipo -info libmp3lame.a

Architectures in the fat file: libmp3lame.a are: armv7 armv7s i386 x86_64 arm64

以下是build的腳本,請注意黃色的字和注釋。

#!/bin/sh

make distclean

CONFIGURE_FLAGS="--disable-shared --disable-frontend"

ARCHS="arm64 armv7s x86_64 i386 armv7"

# directories
# SOURCE是下載lame源碼包,解壓後的目錄,可以把sh腳本放到這個目錄,source改為""
SOURCE=""
# FAT是所有指令集build後,輸出的目錄,所有靜態庫被合並成一個靜態庫
FAT="fat-lame"

# SCRATCH是下載lame源碼包,解壓後的目錄,必須是絕對路徑
SCRATCH="/Users/8wm/Desktop/lame"
# must be an absolute path
# THIN 各自指令集build後輸出的靜態庫所在的目錄,每個指令集為一個靜態庫
THIN=`pwd`/"thin-lame"

COMPILE="y"
LIPO="y"

if [ "$*" ]
then
if [ "$*" = "lipo" ]
then
# skip compile
COMPILE=
else
ARCHS="$*"
if [ $# -eq 1 ]
then
# skip lipo
LIPO=
fi
fi
fi

if [ "$COMPILE" ]
then
CWD=`pwd`
echo "$CWD/$SOURCE........."
for ARCH in $ARCHS
do
echo "building $ARCH..."
mkdir -p "$SCRATCH/$ARCH"
cd "$SCRATCH/$ARCH"

if [ "$ARCH" = "i386" -o "$ARCH" = "x86_64" ]
then
PLATFORM="iPhoneSimulator"
if [ "$ARCH" = "x86_64" ]
then
SIMULATOR="-mios-simulator-version-min=7.0"
HOST=x86_64-apple-darwin
else
SIMULATOR="-mios-simulator-version-min=5.0"
HOST=i386-apple-darwin
fi
else
PLATFORM="iPhoneOS"
SIMULATOR=
HOST=arm-apple-darwin
fi

XCRUN_SDK=`echo $PLATFORM | tr '[:upper:]' '[:lower:]'`
CC="xcrun -sdk $XCRUN_SDK clang -arch $ARCH"
#AS="$CWD/$SOURCE/extras/gas-preprocessor.pl $CC"
CFLAGS="-arch $ARCH $SIMULATOR"
CXXFLAGS="$CFLAGS"
LDFLAGS="$CFLAGS"

CC=$CC $CWD/$SOURCE/configure \
$CONFIGURE_FLAGS \
--host=$HOST \
--prefix="$THIN/$ARCH" \
CC="$CC" CFLAGS="$CFLAGS" LDFLAGS="$LDFLAGS"

make -j3 install
cd $CWD
done
fi

if [ "$LIPO" ]
then
echo "building fat binaries..."
mkdir -p $FAT/lib
set - $ARCHS
CWD=`pwd`
cd $THIN/$1/lib
for LIB in *.a
do
cd $CWD
lipo -create `find $THIN -name $LIB` -output $FAT/lib/$LIB
done

cd $CWD
cp -rf $THIN/$1/include $FAT
fi

3. Undefined symbols for architecture arm64…

Undefined symbols for architecture arm64(其cpu架構)

" OBJC_CLASS $_XXX",referenced from: 之類的問題,很多人看到這些很頭疼,不知道從何下手去修改。以下是我總結的相關修改辦法。如下圖

這是一個在arm64架構下,找不到定義的錯誤。 這類錯誤我總結的就六種,.m 缺失、靜態庫沒導入(不支持arm64 架構,現在基本都支持了,如果不支持更新相關靜態庫。怎麼查看參考文末)、library路徑問題、header 文件路徑、Valid Architectures 指定錯誤,連接器參數問題

1.那麼首先檢查 Architectures 選項

通常情況下,Build Active Architectures Only 在Debug 模式為YES,Release模式為NO。

Valid Architectures 為 arm64 armv7 armv7s

需要你了解的是 只有連接了Active 的調試設備,這個選項才生效,只編譯當前設備對應的指令集。如果你沒有連接設備,那麼這里即使是YES,也不會生效。編譯器會按照你的Valid Architectures和Architectures指定的二進制包進行編譯。

具體參考

armv6 設備: iPhone, iPhone2, iPhone3G, 第一代、第二代 iPod Touch

armv7 設備: iPhone3GS, iPhone4, iPhone4S

armv7s設備: iPhone5, iPhone5C, iPad4(iPad with Retina Display)

arm64 設備: iPhone5S, iPad Air, iPad mini2(iPad mini with Retina Display) 之後出的到X都是arm64的設備了

2. 向 Link Binary With Libraries 中 添加相應的framework ,向Compile Source 添加你缺失的.m

3.修改 Other Linker Flags 添加 -ObjC 和 $(inherited),(也可以直接添加缺失的framework 如: -framework "frameworkname" )

4. Header Search Path 和Library Search Path 先添加$(inherited),如果編譯後,沒有出現,就手拖缺失文件的相關路徑(如果路徑為多層級,選擇遞歸搜索recursive 默認是non-recursive)

5.最後檢查 framework 和.m 有沒有 勾選 target membership 。

總之,如果先思考是靜態庫問題,還是其他文件問題,會節約很多時間。以上總結,以留檔備查,也希望可以給別人一些思路。

實例 1: 錯誤信息中有明顯的提示 does not contain bitcode。 所以 直接設置 bitcode 為NO 就可以了

查看.a或.framework 的靜態庫文件都支持哪些架構, 終端 進入工程根目錄 find . -name *.a -exec lipo -info "{}" 或者.framework

4. ARMClang6.1編譯優化導致的訪問不對齊異常

keil-project-options for target-選項卡c/c++ 左側中間有個optimization 後面的對應的就是編譯優化設置 level 0就是不優化

5. arm-linux-gcc交叉編譯器的製作,以及版本選擇問題。

,需要必須有足夠動經驗來支持。
另外,用 RH9 的都是高手,我想你的知識不需要來提問了吧?

1、在 PC 上編譯 arm 的程序當然需要較差編譯器,這個需要自己安裝,或者著現成的交叉編譯器環境,一般是一個特殊參數編譯出來的 gcc + binutils + glibc + linux-header。這個每個人動環境不同,一般都需要自己編譯一個,當然沒有特殊需求,也可以找現成的。不過很難找,因為這套環境還要和你動系統搭配,不然環境不匹配,連這個環境都不能運行,那就更談不上編譯東西了。
有關自己編譯搭建交叉編譯環境,可以看看一個特殊的 Linux 發行版 LFS 的分支: CLFS 。

2、移植分很多意思,移植有可能就意味著這套源代碼不能在目標系統上面編譯,需要你根據相應的知識去修改源代碼來讓這套代碼適應目標編譯器的要求,比如源代碼有 SSE4 的優化,這套程序在非 SSE4 CPU 上無法編譯運行,但目標機器連 SSE1 都不支持。那麼就需要移植。
或者移植僅僅是根據新的環境進行編譯,不需要進行源代碼修改,只需要進行一下編譯就能運行的程序,也可以稱為移植,就是從一個環境、架構 -》另一個環境、架構。都可以稱為移植,但真正的移植意味著修改程序源代碼來適應新環境。你說的這種移植是最簡單的移植。

3、決定目標硬體環境 -》搭建目標編譯器 -》製作目標環境(內核,基礎軟體庫)-》進行應用移植(移植需要的軟體、主應用程序)-》搭建系統文件系統 -》導入目標系統-》啟動目標系統&應用。說起來很簡單,因為這是完全沒有問題的條件下。
至於超級終端。那是用來控制目標系統的。目標系統有可能不能插鍵盤滑鼠顯示器,這就需要一個遠程網路鏈接來進行控制。以及通過遠程鏈接來發送數據。這都需要終端的支持。

虛擬機下面進行開發,不能發揮你的計算機的性能。而且因為隔著 VMware 的軟體模擬層,可能還不會很方便的讓你鏈接目標設備。

至於用 socket ,我還沒見到你的目標需要這個東西,因為所有的東西都是現成的源代碼。不需要你從 0 開始寫,當然你想自己寫一個系統內核,或者伺服器程序,或者全套的系統+應用,我絕對不攔你,但希望你寫完這套東西,能把源代碼發布出來。
ads 可以認為是一個支持環境,他本身不是一個系統的開發 SDK 。
-------------------------------------
ads 沒用過,印象里他還有模擬器,調試器什麼的程序。功能上要比 Linux 開發環境,WinCE 環境下面的東西更多更偏向於硬體方面,畢竟 ads 是 arm 出品的,不太可能偏向於軟體部分設計。Linux 和 WinCE 都是系統而不是硬體工具。

你可以認為交叉編譯器是一個應用程序,一個輸出器。把源代碼輸出為 arm 的代碼,這個應用程序的輸出,是靠他自己的環境,而不是當前系統的環境的。
當前系統的各個軟體的版本,不能影響交叉編譯器輸出的環境(理論上,現實有的時候總是從別的地方給你打擊……),交叉編譯器一般至少有 gcc 、binutils 、glibc 庫、linux kernel 頭文件。

在軟體需求上。
頭文件誰都不依賴,glibc 只需要內核頭文件,其他程序全都依賴於 glibc 。也就是所有程序都不依賴內核,僅僅是依賴於內核頭文件。

gcc 和 binutils 是把程序源代碼根據上面各個環節的需提供的功能來輸出為上面環節裡面的二進製程序。依賴你當前環境的,只有 gcc 和 binutils 兩個程序的執行、控制環節。只有他們兩個依賴的,而不是你的交叉編譯後的程序。

至於編譯器版本的選擇,新版本功能更好,舊版本兼容更好。
這個要看你的實際需要了。應用程序源代碼也調編譯器的,同時也依賴於軟體庫的功能。

arm 開發建議穩定、兼容優先。當然也可以嘗試最新的編譯環境,來獲取更好的優化(前提是還有什麼代碼優化的話)。
另外,團IDC網上有許多產品團購,便宜有口碑

熱點內容
電視上伺服器地址 發布:2023-02-02 07:13:36 瀏覽:125
大眾速騰30周年紀念款有哪些配置 發布:2023-02-02 07:10:43 瀏覽:710
伺服器如何克隆資料庫 發布:2023-02-02 07:09:05 瀏覽:479
java查看位元組碼 發布:2023-02-02 07:08:29 瀏覽:710
ftp修復 發布:2023-02-02 07:08:20 瀏覽:270
pythonopencv流媒體 發布:2023-02-02 07:07:29 瀏覽:425
腳本軟體哪個好用 發布:2023-02-02 07:01:19 瀏覽:204
esp32編譯10版本庫出錯 發布:2023-02-02 06:59:53 瀏覽:280
高效能量存儲系統 發布:2023-02-02 06:57:27 瀏覽:916
java的字母 發布:2023-02-02 06:55:58 瀏覽:394