2017-10-04 54 views
1

我正在運行一個代碼(iHARM2D),它需要羣集上的GNU scientific library library(GSL)。由於GSL庫沒有安裝在集羣上,我必須在那裏編譯它,並在編譯實際代碼時正確鏈接它。在我的shell腳本我寫鏈接到羣集上的GNU科學庫?

cd whereGSLsource 
./configure --prefix=/homefolder/iHARM/GSLcompiled 
make && make install 

這編譯GSL並將結果放置在/ homefolder/iHARM/GSLcompiled/lib目錄,/ homefolder/iHARM/GSLcompiled /包括等

this answer,我應該能夠通過我的主要代碼

export CPATH="/homefolder/iHARM/GSLcompiled/include":$CPATH 
export LIBRARY_PATH="/homefolder/iHARM/GSLcompiled/lib":$LIBRARY_PATH 

但是在編譯之前寫以下行到我的shell腳本來編譯,這似乎並沒有因爲編譯返回類型「未定義參考`的錯誤正確鏈接GSL gsl_some_fun ction'」。 (當GSL的默認安裝和使用鏈接它工作在我的電腦上。)

由GSL輸出提出另一種可能在編譯期間或this answer是修改LD_LIBRARY_PATH變量

LD_LIBRARY_PATH="/homefolder/iHARM/GSLcompiled/lib":$LD_LIBRARY_PATH 

但這給出了同樣的結果。同樣它沒有當我嘗試使用-L和-I選項

cd iHARM 
gcc -someoptions -I../GSLcompiled/include/ -L../GSLcompiled/lib ./some.o -o harm 

由GSL提出另一種選擇是使用

gcc -someoptions -Wl,-rpath -Wl,"/homefolder/iHARM/GSLcompiled/lib" ./some.o -o harm 

然而,無論這些工作的鏈接。

如何正確鏈接GSL?

(我不是很在這個經歷了那麼這也可能是語法或使一些非常基本的錯誤。)

+0

您的'--prefix'設置可能太具體。請參閱https://stackoverflow.com/a/16363784/841108 –

回答

1

運行第一configure --help;你會發現它接受你想要使用的--enable-static選項。

順便說一句,你可以(也可能應該)在你的筆記本電腦上安裝Linux並編譯它(然後scp一個大多數靜態鏈接二進制到你的羣集)。

對於所有自動配置的軟件,您最好共享一個共同的--prefix。見this。閱讀documentation of autoconf。假設你總是使用--prefix=$HOME/soft(它不需要任何root權限)。

您可以用make編譯然後做一個make install DESTDIR=/tmp/gslinst使安裝的東西進入/tmp/gslinst,你會檢查並適當後者複製到與您的前綴目錄。您可以找到libgsl.alibgslcblas.a。在我的Debian系統上,libgsl-dev包提供了它們(所以我不需要重建它)。

然後你會使用這些靜態庫。您可以爲它們提供完整路徑,即在鏈接gcc命令中明確使用$HOME/soft/lib/libgsl.a,例如harm,例如,鏈接它

gcc some.o $HOME/soft/lib/libgsl.a -o harm 

但YMMV。至gcc的參數順序很重要。

您不需要或不想弄髒帶有靜態鏈接的$LD_LIBRARY_PATH-Wl,-rpath。當你想要動態鏈接時,請閱讀rpath

另請參閱pkg-config講述的內容。

+0

解決方案確實是以gcc的方式將參數寫入您聲明的方式! (另外,是的,按照正確的順序。) – Void