C++ 正在尝试安装和使用LAPACK++;,加载共享库的问题

C++ 正在尝试安装和使用LAPACK++;,加载共享库的问题,c++,shared-libraries,lapack++,C++,Shared Libraries,Lapack++,我刚开始使用库,我在使用lapack++和让它工作时遇到了一些麻烦。我将解释到目前为止我所做和尝试的事情 首先我安装了BLAS和LAPACK,一切顺利。我现在已经安装了LAPACK++2.5.2版(http://lapackpp.sourceforge.net/)所以我可以在C/C++中调用各种线性代数例程。配置之后,make然后makeinstall将所有C/C++头文件放在/usr/local/include/lapackpp/中,其中一些是 arch.h bmd.h gmf.h

我刚开始使用库,我在使用lapack++和让它工作时遇到了一些麻烦。我将解释到目前为止我所做和尝试的事情

首先我安装了BLAS和LAPACK,一切顺利。我现在已经安装了LAPACK++2.5.2版(http://lapackpp.sourceforge.net/)所以我可以在C/C++中调用各种线性代数例程。配置之后,make然后makeinstall将所有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;
}
我通过在导致问题的头文件中显式地写入头文件的位置来解决这个问题

我换了 #包括 具有 #包括

这样做之后,我的代码编译得很好

现在如果我试着编译代码

#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;
}
我得到以下错误

/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的信息为)

这表明我可能链接到了图书馆

通过谷歌搜索,我意识到我需要使用-I和共享库by-L以及库本身by-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
我明白了

在pkg配置搜索路径中未找到包lapackpp。 也许您应该添加包含“lapackpp.pc”的目录 到PKG_CONFIG_PATH环境变量 找不到包“lapackpp”

拉帕克和布拉斯也是如此


我不知道该怎么办。非常感谢您的帮助,谢谢

链接正常,因为您告诉链接器库在哪里,但执行失败,因为加载程序不知道库的位置(您可以检查执行
ldd yourapp
,它显示应用程序所需的库)


通常,您可以通过变量
LD\u library\u PATH
告诉加载程序库在哪里来解决这个问题,但这是一个粗糙的工具。一种不同的解决方案是直接在可执行文件中编码该指令,如描述的,或者简单地使用交换机静态-< /代码>

静态连接应用程序。如果您在一个覆盖LAPACK(和/或BLAS)的C++库之后,您可能会使用一个更现代的库,例如。除了使用LAPACK作为解算器和矩阵分解的后端之外,它还使用表达式模板来加速操作。

我键入了“ldd test”,它确实显示了找不到的库,它的内容是“liblapackpp.so.14=>找不到”。在阅读了那篇文章并搜索了
LD_LIBRARY_PATH
之后,使用
LD_LIBRARY_PATH
似乎是一种链接到一些不在常用文件夹中的库的方式,例如,如果我们想链接到
/home/joebloggs/libraries/mylib
中的某个内容。文件
liblapackpp.so.14
实际上位于
/usr/local/lib
中,所以(假设)它不应该在那里搜索吗?它取决于系统的配置,但显然它没有在那里搜索(“默认”目录是
/usr/lib
)。查看一下
/etc/ld.so.conf
,其中包含动态加载程序查找的目录列表。同样,您也可以使用
libtool
libtool--mode=link gcc yourapp yourfaglass-lyourlib
,它为您生成正确的编译器命令。我阅读了ld.so.conf,这很有帮助,这让我通过键入
ln-s/usr/local/lib/liblapackpp.so.14/usr/lib/
创建了一个链接,现在一切都很好。谢谢你的帮助和信息!非常感谢!不客气。最后一个建议:不要在文件系统上放置SysLink(这不是通过卸载脚本来处理的,因此最终会浪费您的系统)。请考虑在<代码> /ETC/LD中列出的查找目录列表中添加一个条目:<代码> /Ur/Studio/LIB < /代码>。因此,CONF,这是最干净的方法。使用库时,手动将整个编译器命令键入控制台很快就会变得不可处理。你应该让自己适应一些构建工具,经典的是。
./test: error while loading shared libraries: liblapackpp.so.14: cannot open shared object file: No such file or directory
pkg-config lapackpp --libs