ubuntu中的犰狳问题

Posted

技术标签:

【中文标题】ubuntu中的犰狳问题【英文标题】:Armadillo issue in ubuntu 【发布时间】:2014-08-24 20:54:42 【问题描述】:

我一直在使用犰狳在 Ubuntu 和 window8 中编写一个 c++ 程序。在Windows8下程序编译没有问题。

程序只是使用线性系统求解器。

在 Ubuntu 下编译器说

“未定义对 `wrapper_dgels_' 的引用”

我使用的编译器行是:

mpic++ -O2 -std=c++11 -Wall -fexceptions -O2 -larmadillo -llapack -lblas program.o

但是,就在我看到错误之前:

g++ module_of_the_error.o

这是我没有设置的。

我在 Ubuntu 中使用代码块,并使用 cmake 要求的所有库编译了犰狳。 (BLAS

我不知道可能是什么导致了问题,因为在 Visual Studio 中编译完全相同的代码。我已经尝试了建议的编译器行修改,但它似乎不起作用。

感谢任何帮助。

【问题讨论】:

【参考方案1】:

这是我曾经陷入的一个陷阱。您不会喜欢错误的可能原因。

链接器的参数顺序很重要。

代替

mpic++ -O2 -std=c++11 -Wall -fexceptions -O2 -larmadillo -llapack -lblas program.o

尝试:

mpic++ -O2 -std=c++11 -Wall -fexceptions -O2 program.o -larmadillo -llapack -lblas

即,将要链接的目标文件放在库之前的可执行文件中。

顺便说一句,在这个阶段你只是链接已经编译的文件。不必重复仅与编译相关的命令行选项。所以这将是等价的:

mpic++ program.o -larmadillo -llapack -lblas

此外,根据您安装 Armadillo 的方式,您会在该行中添加一个或两个多余的库。以下一项就足够了:

mpic++ program.o -larmadillo

mpic++ program.o -llapack -lblas

【讨论】:

【参考方案2】:

编辑:作为 rerx 状态的答案,问题可能只是提供给 g++ 的开关/参数的简单排序。所有 -l 开关都需要在 -o 开关之后。或者换句话说,将 -o 开关放在任何 -l 开关之前。例如:

g++ prog.cpp -o prog -O3 -larmadillo

原答案:

您的编译器似乎找不到 Armadillo 运行时库。正确的解决方案是使用 -L 开关指定犰狳运行时库的路径。例如 g++ -O2 blah.cpp -o blah -L /usr/local/lib/ -larmadillo

另一种可能的解决方案是在包含犰狳头之前定义ARMA_DONT_USE_WRAPPER,然后直接与LAPACK和BLAS链接。例如:

#define ARMA_DONT_USE_WRAPPER
#include <armadillo>

更多详情请访问犰狳frequently asked questions page。

【讨论】:

谢谢,但还是不行...这太复杂了,我想我会用 eigen 代替... 来吧,这并不难。如果要与任何外部库(例如 OpenCV 或 nlopt 等)链接,则无论如何都需要弄清楚这一点。看起来正确的链接顺序也很简单:把所有的 -l -o 开关之后切换:g++ prog.cpp -o prog -O2 -larmadillo 嗯,问题在于代码块(以及带有 c++ 的 netbeans)将参数放在 g++ 语句旁边,而不是在 program.o 之后。因此,如果您告诉我该怎么做,我可以尝试将参数放在后面,否则我不知道如何强制 IDE 发送这样的编译命令。

以上是关于ubuntu中的犰狳问题的主要内容,如果未能解决你的问题,请参考以下文章

在 ubuntu16.04 上生成运行时犰狳库时出错

犰狳中的并行化

犰狳中的稀疏 svd (C++)

犰狳矩阵中的多种数据类型

如何在linux ubuntu下链接犰狳给出链接错误

当 B 是犰狳中的对称矩阵时的 A * B 计算