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中的犰狳问题的主要内容,如果未能解决你的问题,请参考以下文章