2012-04-04 3 views
2

Я новичок в g ++ и lapack и пытаюсь их использовать. Я столкнулся с проблемой, когда я пытался скомпилировать следующий код наивныеLapack undefined reference

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

Если я запустить команду

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

где test2.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 

BTW, если я запустить команду

$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

The -I/usr/local/include/lapackpp specifes в lapackpp связанные файлы заголовков. Без него компилятор не может найти lapackpp.h при попытке включить его (#include <lapackpp.h>) - см. Ошибку компилятора в вашем ответе

+0

Большое спасибо за ваш ответ Аттила. Когда я попытался решить проблему, я сделал много поиска в Google. Кажется, что все используют «-L/usr/local/lib» вместо «-I/usr/local/include/lapackpp», но этот способ, похоже, не работает на моем компьютере. Мне очень любопытно, почему. И я не видел, чтобы многие из них явно отображали «-lg2c» или «-lgfortran» в своей команде связывания, но, похоже, на их компьютерах все нормально работает. Мне интересно, почему. – Conan

+0

Они могут иметь переменную окружения 'LD_LIBRARY_PATH', чтобы включить некоторые общие библиотеки для удобства. Обратите внимание, что '-L' (также,' LD_LIBRARY_PATH', см. Выше) указывает, где _linker_ должен искать библиотеки, указанные с параметрами '-l' (small L), тогда как' -I' (capital i) указывает, где _compiler_ должен искать заголовки, указанные в директивах '# include' – Attila

+0

Я получил его. Большое спасибо! – Conan

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.

Есть ли у кого-нибудь ответ?