如何在面向unix的Ubuntu機器上使用GCC靜態編譯應用程序?以及我將如何使用不同版本的GLIBC或unix C++應用程序通常依賴的任何32位/ 64位機器和機器?然後,我想以二進制形式分發這個應用程序,並在unix機器上運行它,而無需從源代碼編譯。使用GCC靜態編譯C++應用程序到二進制文件
同樣,我可以compile this app on Windows such that it will run on unix?
如何在面向unix的Ubuntu機器上使用GCC靜態編譯應用程序?以及我將如何使用不同版本的GLIBC或unix C++應用程序通常依賴的任何32位/ 64位機器和機器?然後,我想以二進制形式分發這個應用程序,並在unix機器上運行它,而無需從源代碼編譯。使用GCC靜態編譯C++應用程序到二進制文件
同樣,我可以compile this app on Windows such that it will run on unix?
這怎麼可以創建靜態編譯僅32位可執行文件,它應該在任何已知的Linux工作而不抱怨缺少庫:
g++ -m32 -static -o myprog myprog.cpp
一個缺點這是一個可執行的最小尺寸會至少600 KB。
注意:如果您收到編譯錯誤,請確保已安裝包g++-multilib
。
要編譯它,所以它會在Linux上運行剛剛編譯它,像這樣:
g++ -o myapp myapp-a.cop myappb.cop -L mylib1
這應該對大多數版本的Linux,而且一些版本的FreeBSD了。
這不會靜態鏈接到libstdC++,但這可能是更好的方法。作爲一個經驗法則,您應該動態鏈接到操作系統庫,以便即使系統調用abi發生變化,您的應用程序也能正常工作。
你可以用一個64位的機器強制使用'-m32'作爲標誌。它將編譯模式設置爲32位。
至於編譯在Windows上:是的。你能行的。它被稱爲交叉編譯。你首先需要編譯一個針對Linux的工具鏈。
不幸的是,這個配方不適用於使用不同版本的glibc或libstdC++的系統(比較老的Linux系統),因爲你不使用靜態編譯。 – mvp
一般來說,你不能「定位Unix」。如果你構建一個Linux二進制文件,它將只在Linux系統上運行。 FreeBSD有一個Linux兼容層,但這是唯一的例外。二進制文件不能在Mac OS X,Solaris和其他Unix系統上運行。 –
如果你想從不同的unix機器上的clib和標準庫的不同verisons證明自己,你想要標誌-static-libgcc和-static-libstdC++。這將它們嵌入到文件中,因此您不依賴系統上運行的.so文件。 – Rolle
@Rolle - 您可以添加您的評論作爲答案嗎?它非常有用。 –