2012-04-04 109 views
2

我是g ++和lapack的新手,並試圖使用它們。我遇到一個問題,當我試圖編譯下面的代碼天真Lapack undefined reference

#include <lapackpp.h> 
int main() 
{ 
    LaGenMatDouble A; 
    return 0; 
} 

如果我運行命令

$g++ -L/usr/local/lib -llapackpp test2.cpp 

其中測試2.cpp是CPP文件的名稱,該終端將給出一個錯誤:

test2.cpp:1:22: fatal error: lapackpp.h: No such file or directory 

但是,如果我運行命令:

$g++ -I/usr/local/include/lapackpp -L/usr/local/lib -llapackpp test2.cpp 

終端會給出錯誤:

/tmp/ccUi11DG.o: In function `main': 
test2.cpp:(.text+0x12): undefined reference to `LaGenMatDouble::LaGenMatDouble()' 
test2.cpp:(.text+0x23): undefined reference to `LaGenMatDouble::~LaGenMatDouble()' 
collect2: ld returned 1 exit status 

順便說一句,如果我運行命令

$pkg-config lapackpp --libs 

結果是

-L/usr/local/lib -llapackpp 

能否請你幫我解決這個問題?提前致謝!

回答

1

Lapack需要fortran庫,所以這就是-lgfortran的來源。而且,它似乎爲編譯器提供該庫的確切方式取決於Linux分佈式。從documentation

Requirements

This package requires the packages "blas", "lapack" (without the "++"), and a Fortran compiler. On most Linuxes these are available as pre-compiled binaries under the name "blas" and "lapack". For SuSE 10.x, the Fortran compiler is available as package "gfortran". For SuSE 9.x, the Fortran compiler is available as package "gcc-g77".

不知道爲什麼pkg-config lapackpp --libs沒有列出-lgfortran

-I/usr/local/include/lapackpp其中指定的lapackpp相關的頭文件。如果沒有它,編譯器在嘗試包含它時會找不到lapackpp.h(#include <lapackpp.h>) - 請參閱您的問題中的編譯器錯誤

+0

非常感謝您的回覆,Attila。當我試圖解決問題時,我做了很多谷歌搜索。每個人似乎都使用「-L/usr/local/lib」而不是「-I/usr/local/include/lapackpp」,但這種方式似乎不適用於我的電腦。我很好奇爲什麼。我沒有看到它們中的許多在它們的鏈接命令中明確包含「-lg2c」或「-lgfortran」,但它似乎在他們的計算機上正常工作。我想知道爲什麼。 – Conan 2012-04-06 13:06:02

+0

爲方便起見,他們可能會將其LD_LIBRARY_PATH環境變量設置爲包含一些常用庫。注意'-L'(也就是'LD_LIBRARY_PATH',見上面)指定_linker_應該在哪裏查找用'-l'(小L)選項指定的庫,而'-I'(大寫i)指定_compiler_應該查找'#include'指令中提到的頭文件 – Attila 2012-04-06 14:13:48

+0

我明白了。非常感謝! – Conan 2012-04-06 14:48:18

0

我終於解決了這個問題,但仍然會奇怪爲什麼它必須如此。 ,可以鏈接CPP文件lapackpp庫中唯一的命令是:

g++ foo.cpp -o foo -lgfortran -llapackpp -I/usr/local/include/lapackpp 

它不會不-lgfortran工作,或通過-I/usr/local/include/lapackpp取代-L/usr/local/lib

有沒有人有答案?