2012-10-20 173 views
2

我想用gfortran創建一個共享庫,並將其與libgfortran的靜態版本鏈接以實現可移植性。不幸的是,我沒有設法適當地鏈接不同的對象。我已經找到了一些解決類似問題的帖子,但我無法弄清楚如何解決這個問題。與靜態庫鏈接的共享庫:重定位錯誤

我的源文件全部使用-fPIC標誌進行編譯。當我嘗試的對象與標誌-shared-static-libgfortran鏈接,我得到了以下錯誤消息:

gfortran -shared -static-libgfortran file1.o file2.o file3.o -o "mynewlib.so" 
/usr/bin/ld: ../lib64/libgfortran.a(error.o): relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC 
../lib64/libgfortran.a: could not read symbols: Bad value 
collect2: ld returned 1 exit status 

我使用gfortran 4.6.3,我從頭開始編寫我的服務器上。安裝順利進行,我沒有更改標準配置。我在舊帖子中發現編譯器應該配置爲--with-pic,但在GCC manual中未提及此標誌。

問題來自編譯器還是來自我試圖鏈接不同對象的方式?任何想法如何我可以解決這個問題?

非常感謝您的幫助!

回答

2

當您使用靜態版本時,libgfortran未與-fPIC標誌一起編譯(因此它不包含位置獨立代碼)。

因此,您無法將libfgortran(靜態)鏈接到您的共享對象。

我建議您正確打包庫(例如,作爲Debian或Ubuntu的.deb文件),並將gfortran添加到包的依賴項中。

+0

這是我的猜測,但是如何獲得用'-fPIC'編譯的'libgfortran'版本? – remek

+0

你可能會考慮從它的源代碼編譯GCC,並手動調整一些標誌(可能用'../gcc-4.7/configure CFLAGS =' - fPIC'....),但我真的相信這是不值得的。 –

+0

有關我的問題的更多詳細信息:我在安裝了非常舊的GCC版本的服務器上共享此庫,該服務器太舊無法編譯我的代碼。我剛剛安裝了一個更新版本的GCC來解決這個問題,但是我的同事也必須能夠訪問共享版本的'libgfortran'。我認爲擁有一個獨立的共享庫會更容易。你不想那樣做?有什麼選擇?與他們分享'libgfortran'? – remek