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

3

我对C++和armadillo不太熟悉,遇到了以下构建错误。我尝试测试以下简单代码,将一个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头文件。我在config.hpp文件中使用#define ARMA_USE_HDF5激活了Armadillo中的hdf5插件。我使用最新版本的Armadillo (4.450)和gcc 4.8.3编译器。
我是否遗漏了什么?按照Armadillo用户指南中所述添加-larmadillo和-lhdf5应该足够了。有什么线索吗?谢谢。

可能是g++将C代码链接到C++代码时的链接顺序依赖性问题的重复问题。 - Benjamin Bannier
我投票支持关闭此问题,因为相关的问题链接已经展示了如何操作以及为什么要改变“-laramdillo”和“-lhdf5”的顺序。无论如何,我认为这是Armadillo中的一个问题,因为它依赖于libhdf5却没有与之链接。 - Benjamin Bannier
我明白你的意思,你提供的链接确实很有趣,但在发帖之前我怀疑是一个顺序问题并进行了检查。实际上问题是不同的(请参见下面的答案)。 - jrgc
1个回答

5
由于Linux系统上HDF5库的不同版本存在各种问题,Armadillo的作者已禁用了HDF5库的自动检测。如果您想在Armadillo中使用HDF5库,有两个选择:
1. 解压Armadillo .tar.gz包,并编辑CMakeLists.txt文件。取消注释第231到238行,以find_package(HDF5)开头的内容(即删除#字符)。一旦您修改了CMakeLists.txt文件,请按照README.txt文件中的描述运行cmake安装。
或者
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


1
非常感谢,我尝试了第二个选项,它运行良好。现在我会使用推荐的openblas。 - jrgc
2
CMakeList.txt 文件显示了一个自动检测的参数,默认值为 false:-D DETECT_HDF5=false因此,您可以执行以下操作:cmake -D DETECT_HDF5=true ../ - ben26941

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接