2014-05-21 20 views
5

我們想要創建一個共享庫(.so)來定位所有發行版,包括舊發行版。代碼用C++編寫,並使用C++ 11功能,因此編譯器必須至少爲gcc 4.7。 我們注意到,如果我們在安裝了gcc 4.7.2的Linux機器上編譯我們的代碼(例如,Ubuntu 12.10),那麼.so生成的版本在舊版操作系統上(例如CentOS 5.6)具有「版本1(GNU/Linux)」。版本是「版本1(SYSV)」 - 並且具有GNU/Linux較新版本的庫不能用於較舊的操作系統。在Linux上編譯一個共享庫以定位所有發行版

所以我們嘗試了在CentOS 5.6機器上安裝gcc 4.7的方法,用這個編譯器編譯我們的代碼,並用libstdC++靜態鏈接(-static-libstdC++) - 這產生了一個.so,在我們發現的每一個linux上都可用。

這對32位工作正常。但是,當我們在64位操作系統(CentOS)上遵循相同的方法時,由於我們試圖鏈接到的現有libstdC++。a沒有使用-fPIC編譯,因此失敗了。 。

所以我們試圖編譯海灣合作委員會與「-with-PIC」選項4.7.2來源,但我們不能鏈接到新的libstdC++一個 - 錯誤是:

/opt/centos/devtoolset-1.1/root/usr/libexec/gcc/x86_64-CentOS-linux/4.7.2/ld: /usr/local/lib/libFoo.so: version node not found for symbol [email protected]_3.4 /opt/centos/devtoolset-1.1/root/usr/libexec/gcc/x86_64-CentOS-linux/4.7.2/ld: failed to set dynamic section sizes: Bad value collect2: error: ld returned 1 exit status

我們google搜索到用-fPIC編譯libstdC++可能存在問題,但爲什麼它對32位而不是64位os有效?是否有另一種建議的方式來爲所有Linux發行版創建一個.so?

+0

這將如何連工作? – mjs

+0

+1精心研究的問題!錯誤可能不是你的錯:我使用Google搜索「未能設置動態截面大小:錯誤值」,我只看到錯誤報告出現。順便說一句'_ZNSs7_M_copyEPcPKcm'在錯誤信息中是'std :: basic_string ,std :: allocator > :: _ M_copy(char *,char const *,unsigned long)'。 – Ali

回答

-1

靜態鏈接到libc/libstdC++不應該完成,即使它工作!這是非常危險的,因爲很多安全方面需要更新libc。如果靜態鏈接沒有更新可以填補空白。

我不能相信一個'通用'libc存在,它適用於所有的Linux平臺。 libc是安裝系統的界面,這是很大的差異。一個lib如何適合所有?

當鏈接時,你可以嘗試

-static-libstdc++ -static-libgcc 

爲ld選項。也許這有幫助。但我永遠不會那樣做!

+0

-1他沒有試圖靜態鏈接libc。請重新閱讀這個問題。 – Ali

+0

謝謝!他試圖建立一個運行在多個平臺上的圖書館。因此我相信libstdC++需要libgcc。對不起,提供一個提示:-) – Klaus

+0

即使您靜態鏈接libstdC++,我不認爲有必要靜態鏈接libc。你的回答並不回答他的問題:「爲什麼它適用於32位而不適用於64位操作系統?還有另一種建議的方法來爲所有Linux發行版創建一個.so」?因此,我無法收回我的downvote,對不起。 – Ali

2

我回答了這個在https://gcc.gnu.org/ml/libstdc++/2014-05/msg00107.html

This looks like https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54482 so might be fixed in GCC 4.7.3 (but I'm not sure)

...

PIC is implemented differently for x86 and x86_64, because 64-bit mode has built-in support for it.

+1

我遇到了同樣的問題,我可以確認升級到4.7.3(從4.6.3開始)確實爲我解決了這個問題。相關問題:http://stackoverflow.com/questions/28593592/how-to-link-with-libstdc-pic-a-with-gcc/28625188#28625188 – Edward