ubuntu 安装 armadillo

作者: , 共 2106 字

armadillo是一个线性代数 C++库,封装了blaslapack,提供更直观的接口。

1. 安装依赖项

sudo apt-get install libopenblas-dev liblapack-dev

2. 下载

wget http://sourceforge.net/projects/arma/files/armadillo-7.200.2.tar.xz

最新的版本可以在 http://arma.sourceforge.net/download.html 找到。

3. 安装

tar -Jxvf armadillo-7.200.2.tar.xz
cd armadillo-7.200.2
cmake .
make
sudo make install

4. 测试

cd example1
g++ -o example1 example1.cpp -O2 -larmadillo
./example1

5. 链接错误

测试程序出现下面的编译错误:

    /tmp/ccstw4HV.o: In function `double arma::auxlib::det_lapack<double>(arma::Mat<double> const&, bool)':
    example1.cpp:(.text._ZN4arma6auxlib10det_lapackIdEET_RKNS_3MatIS2_EEb[_ZN4arma6auxlib10det_lapackIdEET_RKNS_3MatIS2_EEb]+0xba): undefined reference to `wrapper_dgetrf_'
    /tmp/ccstw4HV.o: In function `std::ostream& arma::operator<< <double, arma::Op<arma::Mat<double>, arma::op_inv> >(std::ostream&, arma::Base<double, arma::Op<arma::Mat<double>, arma::op_inv> > const&)':
    example1.cpp:(.text._ZN4armalsIdNS_2OpINS_3MatIdEENS_6op_invEEEEERSoS6_RKNS_4BaseIT_T0_EE[_ZN4armalsIdNS_2OpINS_3MatIdEENS_6op_invEEEEERSoS6_RKNS_4BaseIT_T0_EE]+0x166): undefined reference to `wrapper_dgetrf_'
    example1.cpp:(.text._ZN4armalsIdNS_2OpINS_3MatIdEENS_6op_invEEEEERSoS6_RKNS_4BaseIT_T0_EE[_ZN4armalsIdNS_2OpINS_3MatIdEENS_6op_invEEEEERSoS6_RKNS_4BaseIT_T0_EE]+0x25e): undefined reference to `wrapper_dgetri_'
    example1.cpp:(.text._ZN4armalsIdNS_2OpINS_3MatIdEENS_6op_invEEEEERSoS6_RKNS_4BaseIT_T0_EE[_ZN4armalsIdNS_2OpINS_3MatIdEENS_6op_invEEEEERSoS6_RKNS_4BaseIT_T0_EE]+0x404): undefined reference to `wrapper_dgetri_'
    collect2: error: ld returned 1 exit status

没找到具体原因。但把/usr/lib/usr/include下面的 armadillo 删掉可以解决,这可能是因为系统内存在老版本导致的:

sodu rm /usr/lib/libarmadillo*
rm /usr/include/armadillo* -r

删除后运行程序会出现运行时链接错误:

./example1: error while loading shared libraries: libarmadillo.so.7: cannot open shared object file: No such file or directory

这是因为/usr/local/lib没有加到LD_LIBRARY_PATH。我们也可以手工把 local 下面的 so 复制到/usr/lib下:

sodu cp /usr/local/lib/libarmadillo* /usr/lib/

Q. E. D.

类似文章:
相似度: 0.126
boost是除std外最常用的 C++库,覆盖很多常用操作。目前最新的版本是1.59.0
编程 » C++, 内存检查, Linux
获取程序占用的内存量,是一个诡异的需求。但程序写多了,有时候还真需要,尤其是代码运行出现问题的时候。
一个烦心事情是 pypyodbc 查询到的中文结果都显示为问号乱码,下面的代码可以解决这个问题。但会导致无法正常获取查询结果的字段名称(curser.description结果异常)。由于修改了 sys 全局设置,目前不清楚是否还有其它副作用。
编程 » C++, GCC, 编译链接
LD 在链接生成目标文件时,会从左到有扫描输入的依赖库,当依赖库之间也有依赖关系时,必须将「依赖别人的库」放在「被别人依赖的库」的前面。否则会链接失败!失败的症状有:
编程 » Linux, Vim, 文件编码
由于 UNICODE 的优势,目前推荐都用 UTF-8 进行编码。
出现的一个场景是将函数指针用 void