Лапак неопределенная ссылка

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

#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

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

$pkg-config lapackpp --libs

результат

-L/usr/local/lib -llapackpp 

Не могли бы вы помочь мне решить эту проблему? Заранее спасибо!


person Conan    schedule 04.04.2012    source источник


Ответы (2)


Для Lapack требуются библиотеки Fortran, поэтому -lgfortran и есть. Более того, похоже, что точный способ предоставить эту библиотеку для компилятора зависит от дистрибутива Linux. Из документации:

Требования

Для этого пакета требуются пакеты blas, lapack (без ++) и компилятор Fortran. В большинстве Linux они доступны в виде предварительно скомпилированных двоичных файлов под именами blas и lapack. Для SuSE 10.x компилятор Fortran доступен в виде пакета gfortran. Для SuSE 9.x компилятор Fortran доступен в виде пакета gcc-g77.

Не знаю, почему pkg-config lapackpp --libs нет в списке -lgfortran

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

person Attila    schedule 06.04.2012
comment
Большое спасибо за ответ, Аттила. Я много искал в Google, когда пытался решить проблему. Кажется, все используют -L/usr/local/lib вместо -I/usr/local/include/lapackpp, но этот способ не работает на моем компьютере. Мне очень интересно, почему. И я не видел, чтобы многие из них явно включали -lg2c или -lgfortran в свою команду связывания, но, похоже, на их компьютерах это работает нормально. Мне интересно, почему. - person Conan; 06.04.2012
comment
У них может быть установлена ​​переменная окружения LD_LIBRARY_PATH для включения некоторых общих библиотек для удобства. Обратите внимание, что -L (также LD_LIBRARY_PATH, см. выше) указывает, где компоновщик должен искать библиотеки, указанные с параметрами -l (маленькая L), тогда как -I (заглавная i) указывает, где компилятор следует искать заголовки, упомянутые в #include директивах - person Attila; 06.04.2012

Я, наконец, решил проблему, но все еще задаюсь вопросом, почему это должно быть так. Единственная команда, которая может связать файл cpp с библиотекой lapackpp:

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

Это не будет работать без -lgfortran или с заменой -I/usr/local/include/lapackpp на -L/usr/local/lib.

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

person Conan    schedule 06.04.2012