Попытка установить и использовать LAPACK++, проблемы с загрузкой общих библиотек
Я новичок в использовании библиотек, и у меня возникли некоторые проблемы с lapack++ и заставить его работать. Я объясню, что я сделал и попробовал до сих пор.
Сначала я установил BLAS и LAPACK, и все прошло хорошо. Теперь я установил LAPACK++ версии 2.5.2 (http://lapackpp.sourceforge.net/), чтобы я мог вызывать различные процедуры линейной алгебры в C/C++. После того, как я сконфигурирую, make, а затем make install, помещает все заголовочные файлы C / C++ в /usr/local/include/lapackpp/, некоторые из которых являются..
arch.h
bmd.h
gmf.h
lapackc.h
lautil.h
spdmd.h
ultgmd.h
bfd.h
...
а также следующие файлы в /usr/local/lib
liblapackpp.la
liblapackpp.so
liblapackpp.so.14
liblapackpp.so.14.2.0
Теперь, если я попытаюсь скомпилировать с помощью g++ простой код
#include <lapackpp/lapackpp.h>
using namespace std;
int main(int argc, char** argv) {
return 0;
}
Я получаю следующий вывод...
In file included from /usr/local/include/lapackpp/lapackc.h:14,
from /usr/local/include/lapackpp/lapack.h:10,
from /usr/local/include/lapackpp/lapackpp.h:16,
from test.cpp:1:
/usr/local/include/lapackpp/lacomplex.h:45:23: error: laversion.h: No such file or directory
/usr/local/include/lapackpp/lacomplex.h:48:17: error: f2c.h: No such file or directory
In file included from /usr/local/include/lapackpp/lapackpp.h:47,
from test.cpp:1:
/usr/local/include/lapackpp/latmpl.h:36:22: error: lafnames.h: No such file or directory
Я решил эту проблему, явно указав расположение файла заголовка в файле заголовка, который вызывал проблемы.
Например. Я заменил #include на #include
После этого мой код компилируется нормально.
Теперь, если я попытаюсь скомпилировать код
#include <cstdlib>
#include <iostream>
#include <lapackpp/lapackpp.h>
using namespace std;
int main(int argc, char** argv) {
LaGenMatDouble A(5,5);
cout << "This is a test." << endl;
return 0;
}
набрав
g++ test.cpp -o test -I usr/local/include/lapackpp
Я получаю следующие ошибки
/tmp/ccAq6nkP.o: In function `main':
test.cpp:(.text+0x22): undefined reference to `LaGenMatDouble::LaGenMatDouble(int, int)'
test.cpp:(.text+0x4f): undefined reference to `LaGenMatDouble::~LaGenMatDouble()'
test.cpp:(.text+0x67): undefined reference to `LaGenMatDouble::~LaGenMatDouble()'
collect2: ld returned 1 exit status
(Информация о LaGenMatDouble находится здесь)
что говорит о том, что я могу неправильно ссылаться на библиотеку?
После некоторого поиска в Google я понял, что мне нужно связать файлы заголовков, используя -I и общую библиотеку с помощью -L и саму библиотеку с помощью -llapackpp, так что я набрал
g++ test.cpp -o test -I usr/local/include/lapackpp -L usr/local/lib -llapackpp
который скомпилировал код, теперь, когда я запустил программу, набрав./test я иду ошибка
./test: error while loading shared libraries: liblapackpp.so.14: cannot open shared object file: No such file or directory
и теперь я в замешательстве.
Я не уверен, что это как-то связано с проблемой, но когда я печатаю
pkg-config lapackpp --libs
я получил
Пакет lapackpp не найден в пути поиска pkg-config. Возможно, вам следует добавить каталог, содержащий `lapackpp.pc', в переменную среды PKG_CONFIG_PATH. Пакет'lapackpp'не найден.
То же самое происходит и с Lapack и Blas.
Я не уверен, что делать. Любая помощь будет очень ценится, спасибо!
2 ответа
Связывание идет хорошо, потому что вы сообщаете компоновщику, где находится библиотека, но выполнение не удалось, потому что загрузчик ничего не знает о расположении ваших библиотек (вы можете проверить это ldd yourapp
, которая показывает библиотеку, необходимую для вашего приложения).
Обычно это можно решить, сообщив загрузчику, где находится библиотека через переменную LD_LIBRARY_PATH
, но это грубый инструмент. Другое решение состоит в том, чтобы закодировать эту инструкцию непосредственно в исполняемый файл, как описано здесь, или просто статически связать ваше приложение с помощью переключателя. -static
Если вам нужна библиотека C++, которая упаковывает LAPACK (и / или BLAS), вам лучше использовать более современную библиотеку, такую как Armadillo. Помимо использования LAPACK в качестве бэкэнда для решателей и матричных факторизаций, он использует шаблоны выражений для ускорения операций.