2013-12-18 41 views
6

我安裝在Ubuntu LAPACK通過以下the instructiongfortran LAPACK 「未定義參考」 錯誤

sudo apt-get install liblapack-dev 

因而我能找到/usr/lib/libblas/libblas.a/usr/lib/lapack/liblapack.a,然後與randomsys1 example測試它在gfortran

gfortran -llapack -lblas randomsys1.f90 
    gfortran -llapack -L/usr/lib/lapack -lblas -L/usr/lib/libblas randomsys1.f90 

但我收到以下錯誤(dgesv是一個LAPACK例程):

/tmp/ccnzuuiY.o: In function `MAIN__': 
randomsys1.f90:(.text+0xb): undefined reference to `init_random_seed_' 
randomsys1.f90:(.text+0x3c2): undefined reference to `dgesv_' 
collect2: ld returned 1 exit status 

安裝LAPACK有什麼問題嗎?非常感謝!

+5

嘗試將鏈接命令(即-llapack -lblas)*放在要編譯的文件的名稱後面。否則,鏈接器可能會嘗試按錯誤順序解析符號。 – janneb

+1

非常感謝@janneb!它確實有用! – Randel

回答

5

gcc/gfortran documentation

-llibrary-l library

鏈接時搜索庫命名庫。 (第二種替代方法是將庫作爲單獨的參數,僅適用於POSIX 規範,不建議使用。)

它在命令中寫入此選項的位置有所不同,鏈接器會按指定的 順序搜索並處理庫和對象文件。因此,'foo.o -lz bar.o'在文件foo.o之後但在bar.o之前搜索庫'z' 。如果bar.o引用 'z'中的函數,則可能不會加載這些函數。

鏈接器搜索該庫的一個標準目錄列表,該目錄實際上是一個名爲liblibrary.a的文件。鏈接器然後 使用這個文件,就好像它已經按名稱精確指定一樣。

搜索的目錄包括幾個標準系統目錄以及您使用-L指定的任何目錄。

通常以這種方式找到的文件是庫文件 - 其成員是對象文件的歸檔文件。鏈接器通過 處理歸檔文件,以查找定義符號的成員,該符號迄今爲止已引用但未定義的 。但是,如果找到的文件是普通對象文件的 ,則它將以通常的方式鏈接。使用-l選項和指定文件名之間唯一的 區別是 -l圍繞帶有'lib'和'.a'的庫並搜索多個 目錄。

所以,你必須把第一-L/directory/of/the/library所以編譯器知道包含您的庫的目錄,並然後-llibrary標誌。

+0

謝謝@MBR!上面的@ janneb的評論解決了這個問題。 – Randel