2013-11-27 35 views
3

我有一個從Windows移植到Linux的應用程序,一切正常,但... 我們的客戶在Debian 3.1(sarge)上運行的應用程序,我無法強制目標上的gcc版本系統,我更喜歡使用新的gcc(有一些C++ 11結構,我想保留)。我想爲將來的測試和.so文件製作可執行文件。鏈接整個程序靜態

我決定靜態編譯我的過程。

當我運行:

g++ -static -o prog obj/sublib1/file1.o obj/sublib1/file2.o obj/sublib2/file1.o obj/sublib2/file2.o (...) -L../somedir -s -lsomestaticlib 

我得到連接錯誤:

/usr/lib/gcc/i586-suse-linux/4.8/../../../../i586-suse-linux/bin/ld: cannot find -lm 
/usr/lib/gcc/i586-suse-linux/4.8/../../../../i586-suse-linux/bin/ld: cannot find -lc 

該系統了OpenSuse 13.1 32位,UNAME -a:

Linux linux-zfaz.site 3.11.6-4-desktop #1 SMP PREEMPT Wed Oct 30 18:04:56 UTC 2013 (e6d4a27) i686 i686 i386 GNU/Linux 

這個問題可能是與數學庫和C庫。兩個庫的動態版本都位於/ lib目錄中。

(可能並不重要:我試圖使用代碼::塊來構建它,但是當問題發生了,我搬到終端)

我是否需要安裝這些庫的靜態版本?怎麼樣?

回答

0

如果您使用的是最新版本的g ++,則應該只需選擇-static-libstdc++即可。這將確保g ++庫靜態鏈接,但系統庫(通常不是靜態版本)是動態鏈接的。 (在這種情況下請勿使用-static。)

+0

此解決方案在舊版Debian中出現錯誤:'./prog:/lib/libgcc_s.so.1:版本'GCC_4.2.0'找不到(需要./sarmata_C++)'。同時使用'-static-libstdC++'和'-static-libgcc'會給我:'./prog:重定位錯誤:./prog:undefined symbol:_ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE' – entro

+0

你不需要'-static_libgcc',至少在Linux系統(可能無處)。出於各種歷史原因,除非我錯了,'libgcc'還涵蓋了傳統的'libc',它永遠不應該被靜態鏈接。至於其他方面,我也遇到過版本問題。我認爲它與g ++和libstdC++的安裝方式有關,但我從來沒有機會跟進並找出答案。 (請注意,對'-static-libstdC++'的支持是非常新的;舊版本的g ++/libstdC++可能不支持它,或者可能不支持它。) –

0

您需要安裝glibc-devel-static軟件包,但如果適用,@jameskanze的答案是更好的選擇。

+0

這個答案可能會起作用(謝謝!),但它不會不是因爲:FATAL:內核太舊,似乎需要擺脫C++ 11的功能,並嘗試在Debian 3.1上重新編譯它。 – entro