几年未登录CSDN,想想这两天折腾的内容,还是写一写mark一下,希望也能帮到别人。最近在写一些计算相关的代码,开始在win下用C#写,但后来发现计算量挺大,想跑到linux服务器上,测试了一下mono,效率有些打折,没办法,可能需要用C/C++重写了。
查了一些资料,发现Armadillo这个库挺好上手,于是开始了折腾之旅。代码有读取HDF5文件的需求,在Linux和Mac下都好办,装好hdf5的库,编译一下armadillo,gcc编译时加-larmadillo就可以了。win下用的VS2015,弄起来就略麻烦了,编译一般都OK,问题出在链接上,懒得描述了,直接上步骤。
1. 下载armadillo,http://sourceforge.net/projects/arma/files/armadillo-8.300.3.tar.xz
2. 你用64位程序,在压缩包的examples/lib_win64下有lapack和blas库,可以直接用,否则在http://ylzhao.blogspot.com.au/2013/10/blas-lapack-precompiled-binaries-for.html下载。一版32位能运行在64位系统上,但64位程序就不一定能在32位上运行,为了通用性,我下载了32位。
3.解压armadillo到某目录,假设为e:\armadillo,包含文件夹armadillo\include等子目录;
4.解压LAPACK_Release_x86.zip到某目录,假设为e:\lapack,包含2个dll和2个lib文件;
5.下载安装hdf5到某目录,如D:\Program Files\HDF_Group\HDF5\1.8.20,包含include、bin、lib等子目录;
6.创建一个vs2015的c++工程,更改配置选项:
(1)项目-->xx项目属性-->C/C++-->常规,附加包含目录,增加:e:\armadillo\include;D:\Program Files\HDF_Group\HDF5\1.8.20\include
(2)项目-->xx项目属性-->C/C++-->预处理器,预处理器定义,删除_DEBUG;增加H5_BUILT_AS_DYNAMIC_LIB;最终如:
WIN32;H5_BUILT_AS_DYNAMIC_LIB;_CONSOLE;%(PreprocessorDefinitions)
(3)项目-->xx项目属性-->C/C++-->代码生成,运行库,改为:多线程DLL(/MD)
(4)项目-->xx项目属性-->链接器-->常规,附加库目录,增加:e:\lapack;D:\Program Files\HDF_Group\HDF5\1.8.20\include\lib
(5)项目-->xx项目属性-->链接器-->输入,附加依赖项,增加:szip.lib;zlib.lib;hdf5.lib;hdf5_cpp.lib;lapack_win32_MT.lib;blas_win32_MT.lib;其实也不是都需要,看代码需求,有一般不会出错;
(6)修改e:\armadillo\include\armadillo_bits\config.hpp文件,去掉#define ARMA_USE_HDF5前面的注释。
(7)简单测试代码:
#include
#include
#include "hdf5.h"
using namespace std;
using namespace arma;
int main()
{
mat Mat;
string filename = "file.h5";
Mat.load(hdf5_name(filename));
Mat.print("Mat");
return 0;
}
这里file.h5文件是事先准备的h5文件;
(8)先生成一下解决方案;可能会报错,打开工程的Debug目录,也就是exe文件的生成目录,放入以下文件:
blas_win32_MT.dll
lapack_win32_MT.dll
hdf5.dll
szip.dll
zip.dll
hdf5_cpp.dll
然后再运行,以上操作后测试通过。