Question

I am new to using libraries and I am having some trouble with lapack++ and getting it to work. I will explain what I have done and tried so far.

First I installed BLAS and LAPACK and that went fine. I now have installed LAPACK++ version 2.5.2 (http://lapackpp.sourceforge.net/) so I can call various linear algebra routines in C/C++. After I configure, make and then make install it places all the C/C++ header files in /usr/local/include/lapackpp/ some of which are..

arch.h
bmd.h 
gmf.h    
lapackc.h 
lautil.h     
spdmd.h 
ultgmd.h
bfd.h
...

and also the following files in /usr/local/lib

liblapackpp.la
liblapackpp.so
liblapackpp.so.14
liblapackpp.so.14.2.0

Now if I try to compile using g++ the simple code of

#include <lapackpp/lapackpp.h>
using namespace std;

int main(int argc, char** argv) {
return 0;
}

I get the following output...

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

I solved this problem by writing the location of the header file explicitly in the header file that was causing trouble.

Eg. I replaced #include with #include

After doing this my code compiles fine.

Now if I try to compile the code

#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;
}

by typing

g++ test.cpp -o test -I usr/local/include/lapackpp

I get the following errors

/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

(Info on LaGenMatDouble is here )

which suggests I may be linking to the library wrong?

After some googling I realised that I needed to link to the header files using -I and the shared library by -L and the library itself by -llapackpp, so then I typed

g++ test.cpp -o test -I usr/local/include/lapackpp -L usr/local/lib -llapackpp

which compiled the code, now when I ran the program by typing ./test I go the error

./test: error while loading shared libraries: liblapackpp.so.14: cannot open shared object file: No such file or directory

and now I am confused.

I am unsure if this has anything to do with the problem but when I type

pkg-config lapackpp --libs

I get

Package lapackpp was not found in the pkg-config search path. Perhaps you should add the directory containing `lapackpp.pc' to the PKG_CONFIG_PATH environment variable No package 'lapackpp' found

The same happens for lapack and blas too.

I am unsure what to do. Any help would be very much appreciated, thanks!

Was it helpful?

Solution

Linking goes fine because you tell to the linker where the library is, but execution failed because the loader doesn't know anything about the location of your libraries (you can check that performing ldd yourapp, which shows the library needed by your application).

Usually, you can solve that by telling to the loader where the library is through the variable LD_LIBRARY_PATH, but it is a crude tool. A different solution is to encode that instruction directly in the executable, as described here, or simply to link statically your application using the switch -static

OTHER TIPS

If you're after a C++ library that wraps LAPACK (and/or BLAS), you might be better off using a more modern library such as Armadillo. Besides using LAPACK as a backend for solvers and matrix factorizations, it uses expression templates to speed up operations.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top