2012-10-29 55 views
1

如何在面向unix的Ubuntu機器上使用GCC靜態編譯應用程序?以及我將如何使用不同版本的GLIBC或unix C++應用程序通常依賴的任何32位/ 64位機器和機器?然後,我想以二進制形式分發這個應用程序,並在unix機器上運行它,而無需從源代碼編譯。使用GCC靜態編譯C++應用程序到二進制文件

同樣,我可以compile this app on Windows such that it will run on unix

+4

一般來說,你不能「定位Unix」。如果你構建一個Linux二進制文件,它將只在Linux系統上運行。 FreeBSD有一個Linux兼容層,但這是唯一的例外。二進制文件不能在Mac OS X,Solaris和其他Unix系統上運行。 –

+1

如果你想從不同的unix機器上的clib和標準庫的不同verisons證明自己,你想要標誌-static-libgcc和-static-libstdC++。這將它們嵌入到文件中,因此您不依賴系統上運行的.so文件。 – Rolle

+0

@Rolle - 您可以添加您的評論作爲答案嗎?它非常有用。 –

回答

2

這怎麼可以創建靜態編譯僅32位可執行文件,它應該在任何已知的Linux工作而不抱怨缺少庫:

g++ -m32 -static -o myprog myprog.cpp 

一個缺點這是一個可執行的最小尺寸會至少600 KB。

注意:如果您收到編譯錯誤,請確保已安裝包g++-multilib

3

要編譯它,所以它會在Linux上運行剛剛編譯它,像這樣:

g++ -o myapp myapp-a.cop myappb.cop -L mylib1 

這應該對大多數版本的Linux,而且一些版本的FreeBSD了。

這不會靜態鏈接到libstdC++,但這可能是更好的方法。作爲一個經驗法則,您應該動態鏈接到操作系統庫,以便即使系統調用abi發生變化,您的應用程序也能正常工作。

你可以用一個64位的機器強制使用'-m32'作爲標誌。它將編譯模式設置爲32位。

至於編譯在Windows上:是的。你能行的。它被稱爲交叉編譯。你首先需要編譯一個針對Linux的工具鏈。

+0

不幸的是,這個配方不適用於使用不同版本的glibc或libstdC++的系統(比較老的Linux系統),因爲你不使用靜態編譯。 – mvp

相關問題