當前位置:ag真人国际官网-ag旗舰厅官方网站 » 編程軟體 » 交叉編譯靜態編譯

交叉編譯靜態編譯-ag真人国际官网

發布時間: 2024-01-18 01:48:25

a. 可執行程序無法在linux上運行,顯示line 1: syntax error: word unexpected (expecting ")

同求,我也遇到了 這個問題。我用的是arm-linux-gcc 4.4.3 和3.4.1 都是這個錯誤。
程序本身沒問題,在vc上試驗過了。交叉編譯之後用ftp傳完就出現這個錯誤。
您解決了嗎?

b. 現在go可以靜態編譯一個程序么

第一步:all.bash

% cd $goroot/src
% ./all.bash

第一步有些突兀,因為 all.bash 僅僅調用了其它兩個 shell 腳本;make.bash 和 run.bash。如果你在使用 windows 或 plan 9,過程是一樣的,只是腳本擴展名變成了.bat 或.rc。對於本文中的其它腳本,請根據你的系統適當改動。
第二步:make.bash

. ./make.bash --no-banner

main.bash 來源於 all.bash,因此調用退出將正確終止便宜進程。main.bash 有三個主要工作,第一個是驗證編譯 go 的環境是否完整。完整性檢查在過去幾年中建立,它通常嘗試避免使用已知的破損工具或必然失敗的環境進行編譯。
第三步. cmd/dist

gcc -o2 -wall -werror -ggdb -o cmd/dist/dist -icmd/dist cmd/dist/*.c

一旦可用性檢查完畢,make.bash 將編譯產生 cmd/dist,cmd/dist取代了之前存在於go 1 之前的makefile 編譯系統。cmd/dist用來管理少量的pkg/runtime的代碼生成。cmd/dist 是c語言編寫的程序,能夠充分利用系統c編譯器和頭文件來處理大部分主機系統平台的檢測。cmd/dist通常用來檢測主機的操作系統和體系結構,即環境變數$gohostos和$gohostarch .如果是交叉編譯的話,變數 $goos和$goarch可能會由於你的設置而不同。事實上,go 通常用作跨平台編譯器,只不過多數情況下,主機和目標系統一致而已。接下來,make.bash 調用cmd/dist 的引導參數的支持庫、 lib9、 libbio 和 libmach,使用編譯器套件,然後用自己的編譯器進行編譯。這些工具也是用 c 語言寫的中,但是由系統 c 編譯器編譯產生。

echo "# building compilers and go bootstrap tool for host, $gohostos/$gohostarch."
buildall="-a"
if [ "$1" = "--no-clean" ]; then
buildall=""
fi
./cmd/dist/dist bootstrap $buildall -v # builds go_bootstrap

使用的編譯器套件 cmd/dist 編譯產生一個版本的gotool,go_bootstrap。但go_bootstrap並不是完整得gotool,比方說 pkg/net 就是孤立的,避免了依賴於 cgo。要編譯的文件的列表以及它們的依賴項,是由cmd/dist編譯的 ,所以十分謹慎地避免引入新的生成依賴項 到 cmd/go。

第四步:go_bootstrap

現在, go_bootstrap 編譯完成了,make.bash 的最後一部就是使用 go_bootstrap 完成 go 標准庫的編譯,包括整套 gotool 的替換版。

echo "# building packages and commands for $goos/$goarch."
"$gotooldir"/go_bootstrap install -gcflags "$go_gcflags" \
-ldflags "$go_ldflags" -v std

第五步:run.bash

現在,make.bash 完成了,運行回到了 all.bash,它將引用 run.bash。run.bash 的工作是編譯和測試標准庫,運行時以及語言測試套件。

bash run.bash --no-rebuild

使用 --no-rebuild 標識是因為 make.bash 和 run.bash 可能都調用了 go install -a std,這樣可以避免重復,--no-rebuild 跳過了第二個 go install。

# allow all.bash to avoid double-build of everything
rebuild=true
if [ "$1" = "--no-rebuild" ]; then
shift
else
echo '# building packages and commands.'
time go install -a -v std
echo
fi

第六步:go test -a std

echo '# testing packages.'
time go test std -short -timeout=$(expr 120 \* $timeout_scale)s
echo

下一步 run.bash z則是對標准庫中的所有包進行單元測試,這是使用 testing 包編寫的。由於 $gopath 和 $goroot 中的代碼存在於同一個命名空間中,我們不能使用 go test,這可能會測試 $gopath 中的所有包,所以將創建別名std來標識標准庫中的包。由於有些測試需要很長時間,或耗用大量內存,測試將會通過 -short 標識將其過濾。
第七步 runtime 和 cgo 測試

run.bash的下一節將運行大量對cgo支持的平台測試,運行一些季春測試,編譯 go 附帶的一些雜項程序。隨著時間的推移,這份雜項程序列表已經變長了,當它們發現自己並不包含在編譯過程中時,沉默將不可避免的被打破。

第八步: go run test

(xcd ../test
unset gomaxprocs
time go run run.go
) || exit $?

run.bash的倒數第二步調用了$goroot目錄下test文件夾中的編譯器和運行時測試。這其中有描述編譯器和運行時本身的低層級測試。而子目錄 test/bugs 及 test/fixedbugs 中的測試對已知問題和已解決問題進行特別的測試。所有測試的測試驅動器是 $goroot/test/run.go,該程序很小,它調用test文件夾中的每個.go 文件。有些 .go 文件在首行上描述了預期的運行結果,例如,程序失敗或是放出特定的輸出隊列。

第九步go tool api

echo '# checking api compatibility.'
go tool api -c $goroot/api/go1.txt,$goroot/api/go1.1.txt \
-next $goroot/api/next.txt -except $goroot/api/except.txt

run.bash的最後一部將調用api工具,api工具的作用是執行 go 1 約定;導出的符號,常數,函數,變數,類型和方法組成2012年確認的 go 1 api。go 1 寫在 api/go1.txt 文件,而 go 1.1 則寫在 api/go1.1.txt文件中。另一個額外的文件,api/next.txt 描述了g 1.1自後添加到標准庫和運行時中的符號。當 go 1.2 發布時,這個文件將會成為 go 1.2 的約定,另一個新的 next.txt 文件也將被創建。這里還有一個小文件,except.txt,它包括 go 1 約定中被批準的擴展。對文件的增添總是小心翼翼的。

c. ubuntu下使用mingw-w64交叉編譯ffmpeg

網上大部分編譯windows版ffmpeg的教程都是基於msys mingw的,完全運行在windows上。由於msys2的性能實在是太糟糕了,編譯速度太感人,因此決定研究linux下使用mingw-w64交叉編譯

先是安裝ubuntu版的mingw-w64
sudo apt install mingw-w64

然後在configure ffmpeg的時候,在正常的配置項之後加上。
--arch=x86 --target-os=mingw32 --cross-prefix=i686-w64-mingw32-

上面是32位庫編譯的配置,64位的如下
--arch=x86_64 --target-os=mingw32 --cross-prefix=x86_64-w64-mingw32-

而且最好使用動態庫,靜態庫還需要鏈接一大堆mingw的庫實現,而且還可能鏈接失敗。但這樣編譯出來的動態庫,還需要依賴 libgcc_s_sjlj-1.dll。如果要移除這個依賴,configure的時候還要加上 --extra-ldflags='-static-libgcc'

d. golang項目部署3,容器部署

容器部署即使用 docker 化部署 golang 應用程序,這是在雲服務時代最流行的部署方式,也是最推薦的部署方式。

跨平台交叉編譯是 golang 的特點之一,可以非常方便地編譯出我們需要的目標伺服器平台的版本,而且是靜態編譯,非常容易地解決了運行依賴問題。

使用以下指令可以靜態編譯 linux 平台 amd64 架構的可執行文件:

生成的 main 便是我們靜態編譯的,可部署於 linux amd64 上的可執行文件。

我們需要將該可執行文件 main 編譯生成 docker 鏡像,以便於分發及部署。 golang 的運行環境推薦使用 alpine 基礎系統鏡像,編譯出的容器鏡像約為 20mb 左右。

一個參考的 dockerfile 文件如下:

其中,我們的基礎鏡像使用了 loads/alpine:3.8 ,中國國內的消正用戶推薦使用該基礎鏡像,基礎鏡像的 dockerfile 地址: https://github.com/johngcn/dockerfiles ,倉庫地址: https://hub.docker.com/u/loads

隨後使用 " docker build -t main . " 指令編譯生成名為 main 的 docker 鏡像。

需要注意的是,在某些項目的架構設計中, 靜態文轎輪件 配置文件 可能不會隨著鏡像進行編譯發布,而是分開進行管理和發布。

例如,使用 mvvm 模式的項目中(例如使用 vue 框架),往往是前後端非常獨立的,因此在鏡像中往往並不會包含 public 目錄。而使用了 配置管理中心 (例如使用 consul / etcd / zookeeper )的項目中,也往往並不需要 config 目拿帆悔錄。

因此對於以上示例的 dockerfile 的使用,僅作參考,根據實際情況請進行必要的調整。

使用以下指令可直接運行剛才編譯成的鏡像:

容器的分發可以使用 docker 官方的平台: https://hub.docker.com/ ,國內也可以考慮使用阿里雲: https://www.aliyun.com/proct/acr 。

在企業級生產環境中, docker 容器往往需要結合 kubernetes 或者 docker swarm 容器編排工具一起使用。
容器編排涉及到的內容比較多,感興趣的同學可以參考以下資料:

e. linux嵌入式中的靜態交叉編譯是什麼意思

應該說是分為靜態和動態的

靜態就是把需要的庫文件也直接編譯進去

動態則是在需要的時候才去調用,本身不編譯進去

f. 如何在windows上用ndk交叉編譯其他平台程序

目標 :編譯arm64的.so庫

編譯方法:理論上應該有兩種交叉編譯方法,法一,在linux伺服器上安裝交叉工具鏈,直接用交叉工具鏈進行編譯鏈接;法二,使用ndk完成交叉編譯,因為

ndk已經安裝好交叉編譯工具鏈,以及相關的系統庫和系統頭文件了。這兩種方法的區別在於,linux伺服器上的編譯使用的makefile和ndk使用的.mk
文件顯然不同。原因是ndk作為一個集成編譯環境,制定了一套特定的規則用於生成最終的編譯腳本。

這里簡單總結下,如何在windows用ndk進行交叉編譯arm64目標平台的.so庫:

step1:找到ndk開發工具包,官網之類的都可以下載,android-ndk64-r10-windows-x86_64.rar文件

step2:解壓上述ndk工具包,將包含程序源文件和頭文件的文件夾testproject都放入android-ndk-r10下的samples目錄下。

放在其他地方當然也可以,但是後續相對路徑之類的不太好加,既然其他例子都放這,把代碼放這編譯是最保險的了。

step3:在testproject中增加一個jni的文件夾,必須要添加!!!!!!

step4:在jni文件夾中,添加一個android.mk的文件,必須要添加!!!!!

step5:在jni文件夾中,添加一個application.mk的文件與android.mk並列,必須要添加!!!!!

step6:android.mk和application.mk合起來就類似於linux環境下的makefile編譯文件。

如何寫android.mk,可以參考例子helllo-jni中jni文件夾下的android.mk。

local_path:=$(call my-dir) #必須要寫的

include $(clear_vars) #必須要寫的

local_module:=hello-jni #編譯出來的模塊名稱

local_src_files:=hello-jni.c #制定編譯的源文件名稱

include $(build_shared_library)#放在最後

除了上述變數之外,還有其他的指定的變數,

local_cflags,用於指定編譯選項,這個和makefile中是完全一樣的,可以指定編譯選項-g,也可以指定編譯宏及宏值

local_ldlibs,用於指定鏈接的依賴庫,這個可以makefile也是完全一樣的,可以指定鏈接庫用-l庫名,以及指定庫搜索路徑用_l路徑名

local_static_libraries,指定鏈接的靜態庫名,makefile中沒有

local_c_includes,用於指定編譯頭文件的路徑,和makefile中不同,路徑前不需要加-i,直接寫路徑即可,可以是相對路徑或絕對路徑,

多個路徑之間用空格隔開。

編寫上述android.mk碰到的問題有,

(1)使用默認的系統自動載入stl庫頭文件總是出錯,只好手動在local_static_libraries指定sources/cxx-stl/stlport/stlport來完成對#include這種c 形式的頭文件載入

(2)使用$(sysroot)/usr/include來完成對系統庫頭文件的載入,結果找不到sem_t符號,只好指定platforms/android-l/arch-arm64/usr/include

step7:application.mk編寫

app_stl指定使用的stl移植庫,動態或者靜態都行

app_cppflags,指定app編譯的編譯選項

app_abi指定abi規范類型,例如arm64-v8a,也可以寫成all就是把所有的類型全部編一編

app_platform指定編譯的platform名稱,這里可以寫成android-l或者不指定全編。

step8:編譯完成後,運行。

啟動cmd,使用cd /d進行到testproject的jni目錄下

step9:將android-ndk-r10下的ndk-build.cmd直接拖拽到cmd中,此時直接敲回車,就可以編譯了。當然也可以加一個 clean,清除編譯中間文件。

step10:檢查下編譯結果,編譯成功後在testproject中多了兩個文件夾與jni並列的,libs和obj。
編譯鏈接後的結果就在libs中!

g. qt交叉編譯時怎麼添加靜態庫,急!!!

incpath = -i../embedsky/qt-4.5/__install/arm/mkspecs/default -i. -i../embedsky/qt-4.5/__install/arm/include/qtcore -i../embedsky/qt-4.5/__install/arm/include/qtnetwork -i../embedsky/qt-4.5/__install/arm/include/qtgui -i../embedsky/qt-4.5/__install/arm/include -i. -i. -i.
在這里增加你編譯的靜態庫。。。可以試試,我也是新手

h. 建立交叉編譯環境需要配置哪些服務

基於linux操作系統的應用開發環境一般是由目標系統硬體(開發板)和宿主pc機所構成。目標硬體開發板用於運行操作系統和系統應用軟體。

這種情況下,在 arm 平台上進行本機編譯就不太可能了,這是因為一般的編譯工具鏈(compilation tool chain)需要很大的存儲空間,並需要很強的 cpu 運算能力。為了解決這個問題,交叉編譯工具就應運而生了。

比如,我們在 windows 平台上,可使用 visual c 開發環境,編寫程序並編譯成可執行程序。這種方式下,我們使用 pc 平台上的 windows 工具開發針對 windows 本身的可執行程序,這種編譯過程稱為 native compilation,中文可理解為本機編譯。

然而,在進行嵌入式系統的開發時,則不能直接編譯。運行程序的目標平台通常具有有限的存儲空間和運算能力,比如常見的 arm 平台,其一般的靜態存儲空間大概是 16 到 32 mb,而 cpu 的主頻大概在 100mhz 到 500mhz 之間。

熱點內容
發布:2024-01-20 01:08:21 瀏覽:525
發布:2024-01-20 01:07:17 瀏覽:250
愛奇藝正義聯盟為啥不能緩存 發布:2024-01-20 00:52:13 瀏覽:248
caccess查詢資料庫 發布:2024-01-20 00:43:10 瀏覽:769
xp文件夾圖標更改 發布:2024-01-20 00:43:03 瀏覽:19
python和node 發布:2024-01-20 00:37:12 瀏覽:194
android拖拉 發布:2024-01-20 00:00:49 瀏覽:583
少兒編程課程體系介紹 發布:2024-01-20 00:00:48 瀏覽:846
我說你做下載ftp 發布:2024-01-20 00:00:47 瀏覽:8
安卓驅動培訓哪裡好 發布:2024-01-19 23:55:41 瀏覽:987
网站地图