2014-09-05 39 views
1

我反覆遇到沒有找到的庫的問題。如何通過LD_LIBRARY_PATH和鏈接非常正確地獲得它?

在我的.bashrc我:

LD_LIBRARY_PATH= 
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib1 
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib2 
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib3 

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH 

這些路徑包含從那裏我鏈接庫到我的程序與-L/LIB1 -l1a -L/LIB2 -l2a -L/LIB3 -l3a所有文件夾。

現在我開始我的程序獨立:

./program 

也好!

然後,我開始mpiexec的從MPICH:

/mpich/intel/bin/mpiexec -np 2 ./solvertest1 

也好!

但後來我啓用了GDB啓動:

/mpich/intel/bin/mpiexec -np 2 gdb ./solvertest1 

問題,圖書館都沒有發現:

Starting program: /my/program 
/my/program: error while loading shared libraries: libirng.so: cannot open shared object file: No such file or directory 

我懷疑有些不對勁時,LD_LIBRARY_PATH應該通過所有的子進程傳播並將這些腳本和程序產生的shell ...我需要做什麼才能讓每個子進程(以及其他任何將啓動的)知道這些庫在哪裏?

+2

如果你有root權限:不要使用'LD_LIBRARY_PATH'。將所有非系統庫放在'/ usr/local/lib'中,將該路徑添加到'/etc/ld.so.conf',在有用時運行'ldconfig'。 – 2014-09-05 18:04:32

+1

你在調用'export'的自我賦值是多餘的; 'export LD_LIBRARY_PATH'就足夠了。此外,由於'export'命令只是將變量*名稱標記爲可導出的(它不會將值推入環境中),因此可以在創建過程之前的任何時候完成該過程,其環境將由導出的變量組成。 – chepner 2014-09-05 18:43:28

回答

2

由於程序取決於其設置爲運行合適的環境變量,mpiexec的是不給它,它需要ENV,嘗試從mpiexec的文檔的類似:

-x,--envall 將所有環境變量導出到所有進程。

-E,--env名稱值 導出帶有內容值的變量名稱。

5

存放在你的可執行文件的DT_RPATH標籤庫路徑鏈接

-Wl,rpath=/lib1 -Wl,rpath=/lib2 -Wl,rpath=/lib3

這樣你就不需要惹LD_LIBRARY_PATH和shell初始化時。

相關問題