靜態交叉編譯gcc
在編譯命令行中,將使用的靜態庫文件放在源文件後面就可以了。比如:
gcc -L/usr/lib myprop.c libtest.a libX11.a libpthread.a -o myprop
其中-L/usr/lib指定庫文件的查找路徑,編譯器默認在當前目錄下先查找指定的庫文件。
Ⅱ 32 位支持:使用 GCC 交叉編譯
如果你是一個開發者,要創建二進制軟體包,像一個 RPM、DEB、Flatpak 或 Snap 軟體包,你不得不為各種不同的目標平台編譯代碼。典型的編譯目標包括 32 位和 64 位的 x86 和 ARM。你可以在不同的物理或虛擬機器上完成你的構建,但這需要你為何幾個系統。作為代替,你可以使用 GNU 編譯器集合 ( GCC ) 來交叉編譯,在單一的構建機器上為幾個不同的 CPU 架構產生二進制文件。
假設你有一個想要交叉編譯的簡單的擲骰子 游戲 。在大多數系統上,以 C 語言來編寫這個相對簡單,出於給添加現實的復雜性的目的,我以 C++ 語言寫這個示例,所以程序依賴於一些不在 C 語言中東西 (具體來說就是 iostream)。
在你的系統上使用 g++ 命令編譯它:
然後,運行它來確認其工作:
你可以使用 file 命令來查看你剛剛生產的二進制文件的類型:
同樣重要,使用 ldd 命令來查看它鏈接哪些庫:
從這些測試中,你已經確認了兩件事:你剛剛運行的二進制文件是 64 位的,並且它鏈接的是 64 位庫。
這意味著,為實現 32 位交叉編譯,你必需告訴 g++ 來:
為編譯成 32 位二進制,你需要在你的系統上安裝 32 位的庫和頭文件。如果你運行一個純 64 位系統,那麼,你沒有 32 位的庫或頭文件,並且需要安裝一個基礎集合。最起碼,你需要 C 和 C++ 庫(glibc 和 libstdc++)以及 GCC 庫(libgcc)的 32 位版本。這些軟體包的名稱可能在每個發行版中不同。在 Slackware 系統上,一個純 64 位的帶有 32 位兼容的發行版,可以從 Alien BOB 提供的 multilib 軟體包中獲得。在 Fedora、CentOS 和 RHEL 系統上:
不管你正在使用什麼系統,你同樣必須安裝一些你工程使用的 32 位庫。例如,如果你在你的工程中包含 yaml-cpp,那麼,在編譯工程前,你必需安裝 yaml-cpp 的 32 位版本,或者,在很多系統上,安裝 yaml-cpp 的開發軟體包(例如,在 Fedora 系統上的 yaml-cpp-devel)。
一旦這些處理好了,編譯是相當簡單的:
-m32 標志告訴 GCC 以 32 位模式編譯。-march=i686 選項進一步定義來使用哪種最優化類型(參考 info gcc 了解選項列表)。-L 標志設置你希望 GCC 來鏈接的庫的路徑。對於 32 位來說通常是 /usr/lib,不過,這依賴於你的系統是如何設置的,它可以是 /usr/lib32,甚至 /opt/usr/lib,或者任何你知道存放你的 32 位庫的地方。
在代碼編譯後,查看你的構建的證據:
接著,當然, ldd ./dice32 也會指向你的 32 位庫。
在 64 位相同的處理器家族上允許 GCC 做出很多關於如何編譯代碼的假設來編譯 32 位軟體。如果你需要為完全不同的處理器編譯,你必需安裝適當的交叉構建實用程序。安裝哪種實用程序取決於你正在編譯的東西。這個過程比為相同的 CPU 家族編譯更復雜一點。
當你為相同處理器家族交叉編譯時,你可以期待找到與 32 位庫集的相同的 64 位庫集,因為你的 Linux 發行版是同時維護這二者的。當為一個完全不同的架構編譯時,你可能不得不窮追你的代碼所需要的庫。你需要的版本可能不在你的發行版的存儲庫中,因為你的發行版可能不為你的目標系統提供軟體包,或者它不在容易到達的位置提供所有的軟體包。如果你正在編譯的代碼是你寫的,那麼你可能非常清楚它的依賴關系是什麼,並清楚在哪裡找到它們。如果代碼是你下載的,並需要編譯,那麼你可能不熟悉它的要求。在這種情況下,研究正確編譯代碼需要什麼(它們通常被列在 README 或 INSTALL 文件中,當然也出現在源文件代碼自身之中),然後收集需要的組件。
例如,如果你需要為 ARM 編譯 C 代碼,你必須首先在 Fedora 或 RHEL 上安裝 gcc-arm-linux-gnu(32 位)或 gcc-aarch64-linux-gnu(64 位);或者,在 Ubuntu 上安裝 arm-linux-gnueabi-gcc 和 binutils-arm-linux-gnueabi。這提供你需要用來構建(至少)一個簡單的 C 程序的命令和庫。此外,你需要你的代碼使用的任何庫。你可以在慣常的位置(大多數系統上在 /usr/include)放置頭文件,或者,你可以放置它們在一個你選擇的目錄,並使用 -I 選項將 GCC 指向它。
當編譯時,不使用標準的 gcc 或 g++ 命令。作為代替,使用你安裝的 GCC 實用程序。例如:
驗證你構建的內容:
這是一個如何使用交叉編譯的簡單的示例。在真實的生活中,你的源文件代碼可能產生的不止於一個二進制文件。雖然你可以手動管理,在這裏手動管理可能不是好的正當理由。在我接下來的文章中,我將說明 GNU 自動工具,GNU 自動工具做了使你的代碼可移植的大部分工作。
via: https://opensource.com/article/19/7/cross-compiling-gcc
作者: Seth Kenlon 選題: lujun9972 譯者: robsean 校對: wxy
Ⅲ GCC怎樣進行靜態編譯
-static 前提是GTK提供了靜態庫否則沒戲
a有可能是導出庫,先編譯 再檢查依賴 用Dependency Walker 缺啥 打包啥
Ⅳ 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網上有許多產品團購,便宜有口碑
Ⅳ LINUX交叉編譯工具鏈和GCC是什麼關系啊
編譯工具鏈一般最簡化的為
binutils
+
gcc
+
glibc
+
kernel-header
組合的環境。
GCC
就是編譯器,他的輸出每次安裝只能有針對一個架構的指令輸出。如果要多個架構輸出,那就要裝多個
GCC
,所以編譯工具鏈裡面會有一個
GCC
。
交叉編譯就是跨架構編譯,編譯出來的程序不能在本機執行(當然有例外情況)。所以這個時候就需要交叉編譯工具鏈。
工具鏈光有
GCC
是不行的,還需要一個
binutils
的二進制連接器,以及一個最基本的目標架構的
C
庫,C
庫還需要一個目標架構的內核源代碼才能完全工作(當然不是必須的,但編譯有的時候需要)
又因為
GCC
、binutils
不能實現單軟體同時多架構輸出,所以需要單獨另裝,又加上
C
庫和內核頭文件需要目標架構的東西而不能用本機本地架構的數據。
所以一個交叉編譯工具鏈就是針對目標架構准備的單獨安裝單獨使用的
binutils
+
gcc
+
glibc
+
kernel-header
的集合了。
PS:這個
kernel-header
並不一定就是
Linux
,他還可以是別的系統核心開發庫,比如
FreeBSD
。