尝试安装和使用 LAPACK++,加载共享库时出现问题
Posted
技术标签:
【中文标题】尝试安装和使用 LAPACK++,加载共享库时出现问题【英文标题】:Trying to install and use LAPACK++, problems with loading shared libraries 【发布时间】:2012-05-23 11:15:32 【问题描述】:我是使用库的新手,我在使用 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 <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 的信息是 here)
这表明我可能链接到库错误?
经过一番谷歌搜索后,我意识到我需要使用 -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
我明白了
在 pkg-config 搜索路径中找不到包 lapackpp。 也许你应该添加包含 `lapackpp.pc' 的目录 到 PKG_CONFIG_PATH 环境变量 找不到包“lapackpp”
lapack 和 blas 也是如此。
我不确定该怎么做。任何帮助将不胜感激,谢谢!
【问题讨论】:
"by typing..." 在使用库时,手动将整个编译器命令快速输入到控制台变得无法处理。你应该适应一些构建工具,经典的是Make。 【参考方案1】:链接很好,因为你告诉链接器库在哪里,但是执行失败,因为加载器不知道你的库的位置(你可以检查执行ldd yourapp
,它显示了所需的库您的申请)。
通常,您可以通过变量LD_LIBRARY_PATH
告诉加载程序库在哪里来解决这个问题,但它是一个粗略的工具。另一种解决方案是直接在可执行文件中对该指令进行编码,如here 所述,或者只是使用开关-static
静态链接您的应用程序
【讨论】:
我输入了“ldd test”,它确实显示了它找不到哪个库,它显示为“liblapackpp.so.14 => not found”。在阅读了那篇文章并搜索了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 yourflags -lyourlib
,它会为你生成正确的编译命令。
我阅读了 ld.so.conf 这很有帮助,这让我通过输入 ln -s /usr/local/lib/liblapackpp.so.14 /usr/lib/
来建立一个链接,现在一切都很好。感谢您的帮助和信息!非常感谢!
不客气。最后一个建议:不要在整个文件系统中放置符号链接(卸载脚本不会处理这些符号链接,因此最终会弄乱你的系统)考虑在/etc/ld.so.conf
下列出的查找目录列表中添加一个到/usr/local/lib
的条目,这是最干净的方法。【参考方案2】:
如果您正在使用包装 LAPACK(和/或 BLAS)的 C++ 库,则最好使用更现代的库,例如 Armadillo。除了使用 LAPACK 作为求解器和矩阵分解的后端外,它还使用表达式模板来加快运算速度。
【讨论】:
以上是关于尝试安装和使用 LAPACK++,加载共享库时出现问题的主要内容,如果未能解决你的问题,请参考以下文章
Windows Scipy 安装:未找到 Lapack/Blas 资源
运行 Gitlab CI 作业以使用 webdriverio 执行自动化测试时出现“加载共享库时出错:libnss3.so”
未加载库:尝试使用 mysql2 gem 在 OS X 10.6 上运行“rails server”时出现 libmysqlclient.16.dylib 错误