【问题标题】:C++ building error for a simple code using armadillo and hdf5 libraries使用犰狳和 hdf5 库的简单代码的 C++ 构建错误
【发布时间】:2014-10-10 09:06:11
【问题描述】:

我对 C++ 和犰狳还是很陌生,我遇到了下面描述的构建错误。我正在尝试测试以下简单代码以将犰狳矩阵保存为 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 在犰狳中激活了hdf5。我使用最新版本的犰狳 (4.450) 和 gcc 4.8.3。

我错过了链接吗?对我来说,添加 -larmadillo 和 -lhdf5 (如犰狳的用户指南中所述)就足够了。有什么线索吗? 谢谢

【问题讨论】:

  • 我投票决定关闭它作为重复,链接的问题应该告诉你做什么和为什么(改变-laramdillo-lhdf5的顺序)。无论哪种方式,我都将其称为犰狳中的一个问题,因为它依赖于 libhdf5,但不会链接到它。
  • 我明白你的意思,你链接到的帖子确实很有趣,但我怀疑是订单问题,并在发布前检查了这一点。问题实际上是不同的(见下面的答案)。

标签: c++ hdf5 armadillo


【解决方案1】:

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

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

2。 正常安装犰狳(无需修改 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

【讨论】:

  • 非常感谢,我尝试了选项 2,效果很好。我现在将按照建议使用我们的 openblas。
  • CMakeList.txt 文件显示了一个默认为 false 的自动检测参数:-D DETECT_HDF5=false 所以你可以这样做:cmake -D DETECT_HDF5=true ../
猜你喜欢
  • 2021-08-16
  • 1970-01-01
  • 2019-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-13
相关资源
最近更新 更多