2010-02-09 53 views
7

我正在爲一個類分級C和C++文件,並且此分配使用GSL庫。由於我的計算機沒有root權限,因此我的GSL庫安裝在我的主目錄中,因此我需要告訴編譯器和連接器在哪裏找到它。告訴ld在哪裏通過環境變量查找目錄

當我自己編寫程序時,這不是問題,因爲我只是將相應的-L和-I標誌添加到gcc。

但是當我編譯學生的文件時,我不想編輯他們的每一個makefile。相反,我想將適當的目錄放入環境變量中,以便它可以無縫地發生。

爲此,我已經導出與庫中的下列變量或包括地點: C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,LIBRARY_PATH和LD_LIBRARY_PATH

但是當我編譯一個學生的項目,

gcc -Wall -o MC_thread MC_thread.c -lgsl -lgslcblas -lpthread -lm 

我收到以下錯誤:

/usr/bin/ld: cannot find -lgsl 
collect2: ld returned 1 exit status 
make: *** [all] Error 1 

我正在使用gcc v 4.1.2。如果我使用gcc v 4.4,我實際上不會得到這個錯誤,但我不知道爲什麼。我的鏈接是:

ld -V 
GNU ld version 2.17.50.0.6-12.el5 20061020. 
+1

嘗試man ld和man ld.so以查看他們使用的環境變量。 LD_LIBRARY_PATH可能工作。 – Eugene 2010-02-09 05:24:03

+2

我認爲LD_LIBRARY_PATH只能被ld.so使用,而不能被ld使用。由於 這是一個編譯時錯誤,而不是運行時錯誤,我將 重點放在爲什麼LIBRARY_PATH不起作用。我會驗證兩件事, 庫文件是否具有正確的名稱,並且實際上是在gcc執行環境中定義的LIBRARY_PATH ? – 2010-02-13 10:21:40

+0

嘗試使用'-v'選項運行gcc,並從輸出中發佈完整的ld 調用。 – 2010-02-13 10:27:37

回答

11

你可以嘗試使用環境變量LIBRARY_PATH

man gcc(版本至少爲4.4)

 
     LIBRARY_PATH 
      The value of LIBRARY_PATH is a colon-separated list of directories, 
      much like PATH. When configured as a native compiler, GCC tries 
      the directories thus specified when searching for special linker 
      files, if it can't find them using GCC_EXEC_PREFIX. Linking using 
      GCC also uses these directories when searching for ordinary 
      libraries for the -l option (but directories specified with -L come 
      first). 

然後再使用LD_LIBRARY_PATH當你運行他們的程序對讓運行時鏈接程序找到庫。

+0

OP表示他正在使用LIBRARY_PATH(自從發佈後,它看起來不像編輯。) – jtniehof 2013-02-13 20:34:52

0

我的建議是要求學生在makefile中支持CFLAGS環境變量,否則會失敗。 :)然後你可以輸出CFLAGS =「 - Lwhatever」。

或者您可以使用LD_LIBRARY_PATH。

+0

您可能是指LDFLAGS,因爲-l和-L是鏈接器參數,而不是編譯器階段參數。但是,我同意。沒有這些變量的Makefiles是無用的。 – 2010-02-20 23:30:10

2

上面的很多答案都建議使用LD_LIBRARY_PATH。但是這是不正確的,因爲它是動態(運行時)鏈接程序的環境變量,而不是編譯時鏈接程序ld。

正確的方式做,這是要求學生追加是這樣的:在它們定義構建規則的點在他們的Makefile

-L$(EXTRA_LINK_DIRECTORY) 

。然後,當你編譯,做這樣的事情:

出口EXTRA_LINK_DIRECORY = /家庭/ ...

1

如果你是一個64位的機器上,這可能是問題。 OMM,gcc 4.1不搜索LIBRARY_PATH中指定的路徑,而是路徑/../ lib64。你需要直接指定-L,或者將目錄符號鏈接到同一級別的lib64,或者混淆gcc規範。

http://gcc.gnu.org/ml/gcc-help/2010-11/msg00360.htmlWhy does g++ look in LIBRARY_PATH/../lib64 and where is this documented?

(OMM,這也與海灣合作委員會4工作。5沒有任何弄亂,所以我猜測他們稍後修復它。)

+0

使用spec文件並沒有多大幫助,因爲只搜索lib意味着gcc沒有找到它的內部位,並且使它同時搜索lib和lib64,這意味着gcc會針對不兼容的32位字符串吐出一堆警告,它發現的位版本。 – jtniehof 2013-02-13 21:02:54

+0

這可能是它!由於我自己安裝了GSL,因此我沒有lib /和lib64 /目錄,而只有一個具有(64位)庫的位置,但沒有預期的lib64 /名稱。 這是一個相當惱人的功能。我猜gcc 4.4和4.5有更好的行爲 – Stephen 2013-02-14 22:05:50