ubuntu中的犰狳问题

Armadillo issue in ubuntu

本文关键字:问题 ubuntu      更新时间:2023-10-16

我一直在用armadillo在Ubuntu和windows8上写一个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中使用代码块,我用所有需要的库编译了armadillo。(BLAS

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

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

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

不是

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

EDIT:正如rex的回答所说,问题可能只是提供给g++的开关/参数的简单排序。所有的- 1开关都要在- 0开关之后。换句话说,把- 0放在-l之前。例如:

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

原始回答:

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

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

#define ARMA_DONT_USE_WRAPPER
#include <armadillo>

更多详细信息请访问犰狳常见问题页面