Compiling

為什麼 ld 找不到這個庫?

  • May 4, 2012

我對這個主題不是很了解,因此無法弄清楚為什麼以下命令不起作用:

$ gfortran -o dsimpletest -O  dsimpletest.o ../lib/libdmumps.a \ 
../lib/libmumps_common.a  -L/usr -lparmetis -lmetis -L../PORD/lib/ \
-lpord -L/home/eiser/src/scotch_5.1.12_esmumps/lib -lptesmumps -lptscotch \
-lptscotcherr /opt/scalapack/lib/libscalapack.a   -L/usr/lib/openmpi/ \ 
-lmpi -L/opt/scalapack/lib/librefblas.a -lrefblas -lpthread
/usr/bin/ld: cannot find -lrefblas
collect2: ld returned 1 exit status

編譯mumps庫時會發生這種情況。上面的命令是由 make 執行的。我在正確的路徑中找到了 librefblas.a:

$ ls /opt/scalapack/lib/ -l
total 20728
-rw-r--r-- 1 root root   619584 May  3 14:56 librefblas.a
-rw-r--r-- 1 root root  9828686 May  3 14:59 libreflapack.a
-rw-r--r-- 1 root root 10113810 May  3 15:06 libscalapack.a
-rw-r--r-- 1 root root   653924 May  3 14:59 libtmg.a

*問題一:*我還以為-L是takes目錄的切換ld,為什麼這裡直接引用文件呢?如果我從 -L 參數中刪除 librefblas.a,我會收到很多“未定義的引用”錯誤。

問題 2: 如果我沒記錯的話,-l應該暗示尋找.a然後尋找。.so是我沒有.so文件的問題嗎?我試圖通過使用找出來gfortran -v ...,但這並沒有幫助我調試它。

我能夠在評論的幫助下解決這個問題,特別感謝@Mat。

由於我想編譯 openmpi 版本,它有助於使用mpif90而不是gfortran,在我的系統上,它是

$ mpif90 --showme
/usr/bin/gfortran -I/usr/include -pthread -I/usr/lib/openmpi -L/usr/lib/openmpi -lmpi_f90 -lmpi_f77 -lmpi -ldl -lhwloc

引用自:https://unix.stackexchange.com/questions/37882