使用armadillo和hdf5库的简单代码的C ++构建错误

时间:2014-10-10 09:06:11

标签: c++ hdf5 armadillo

我对C ++和犰狳很陌生,而且我遇到了下面描述的建筑错误。我试图测试以下简单代码将armadillo矩阵保存为hdf5文件:

#include <iostream>
#include <armadillo>

using namespace std;
using namespace arma;

int main()
{
    mat A = randu<mat>(240,320);
    A.save("A.hdf5",hdf5_binary);

    return 0;
}

编译时,我收到以下错误:

/usr/include/armadillo_bits/hdf5_misc.hpp:131: undefined reference in « arma_H5T_NATIVE_DOUBLE »
/usr/include/armadillo_bits/hdf5_misc.hpp:131: undefined reference in « arma_H5Tcopy »
obj/Debug/main.o: in function « bool arma::diskio::save_hdf5_binary<double>   (arma::Mat<double> const&, std::string const&) »:
/usr/include/armadillo_bits/diskio_meat.hpp:1299: undefined reference in « arma_H5Eset_auto »
/usr/include/armadillo_bits/diskio_meat.hpp:1308: undefined reference in « arma::H5check_version(unsigned int, unsigned int, unsigned int) »
/usr/include/armadillo_bits/diskio_meat.hpp:1308: undefined reference in « arma_H5Fcreate »
/usr/include/armadillo_bits/diskio_meat.hpp:1315: undefined reference in « arma_H5Screate_simple »
/usr/include/armadillo_bits/diskio_meat.hpp:1324: undefined reference in « arma_H5Dcreate »
/usr/include/armadillo_bits/diskio_meat.hpp:1330: undefined reference in « arma_H5Dwrite »
/usr/include/armadillo_bits/diskio_meat.hpp:1333: undefined reference in « arma_H5Dclose »
/usr/include/armadillo_bits/diskio_meat.hpp:1334: undefined reference in « arma_H5Tclose »
/usr/include/armadillo_bits/diskio_meat.hpp:1335: undefined reference in « arma_H5Sclose »
/usr/include/armadillo_bits/diskio_meat.hpp:1336: undefined reference in « arma_H5Fclose »

编译说明如下:

g++ -Wall -fexceptions -O2 -g -larmadillo -lhdf5 -c main.cpp -o main

我在Linux Fedora 20系统上使用CodeBlocks。我有打包的HDF5-devel,可以在/usr/include/中找到hdf5.h 我还使用#define ARMA_USE_HDF5中的config.hpp激活了犰狳中的hdf5。我使用最新版本的armadillo(4.450)和gcc 4.8.3。

我错过了链接吗?对我来说,添加-larmadillo和-lhdf5(如犰狳用户指南中所述)应该足够了。任何线索? 感谢

1 个答案:

答案 0 :(得分:2)

由于基于Linux的系统上不同版本的HDF5库存在各种问题,Armadillo的作者已禁用自动检测HDF5库。如果您想将HDF5与Armadillo一起使用,有两种选择:

1。 解压缩armadillo .tar.gz包,然后编辑CMakeLists.txt文件。取消注释第231到238行,从find_package(HDF5)开始(即删除#个字符)。修改CMakeLists.txt后,按照README.txt文件中的说明运行基于cmake的安装。

OR

2。 正常安装Armadillo(无需修改CMakeLists.txt),然后使用(全部在一行)编译程序:

g++ main.cpp -o main -O2 -DARMA_DONT_USE_WRAPPER -DARMA_USE_BLAS -DARMA_USE_LAPACK -DARMA_USE_HDF5 -lblas -llapack -lhdf5

奖励积分: 如果您安装了高速OpenBLAS库并希望Armadillo使用它而不是标准BLAS,请将-lblas更改为-lopenblas