我們想要創建一個共享庫(.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?
這將如何連工作? – mjs
+1精心研究的問題!錯誤可能不是你的錯:我使用Google搜索「未能設置動態截面大小:錯誤值」,我只看到錯誤報告出現。順便說一句'_ZNSs7_M_copyEPcPKcm'在錯誤信息中是'std :: basic_string,std :: allocator > :: _ M_copy(char *,char const *,unsigned long)'。 –
Ali