如何让Armadillo在Windows上运行?

时间:2014-07-03 08:54:01

标签: c++ lapack mingw32 blas armadillo

我不能让Armadillo 4.3在Windows上运行。包含库armadillo/include,我运行g++ "-LC:\\Armadillo\\BLAS_Lapack" -o1 -o test.exe test.o -llapack -lblas,然后收到以下错误消息:

C:/Armadillo/include/armadillo_bits/blas_wrapper.hpp:183: undefined reference to `wrapper_ddot_'
test.o: In function `ZN4arma4blas4gemvIdEEvPKcPKiS5_PKT_S8_S5_S8_S5_S8_PS6_S5_':
C:/Armadillo/include/armadillo_bits/blas_wrapper.hpp:34: undefined reference to `wrapper_dgemv_'
test.o: In function `ZN4arma4blas4gemmIdEEvPKcS3_PKiS5_S5_PKT_S8_S5_S8_S5_S8_PS6_S5_':
C:/Armadillo/include/armadillo_bits/blas_wrapper.hpp:69: undefined reference to `wrapper_dgemm_'

如果我运行g++ -o1 -o test.exe test.o -llapack -lblas,我会

c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: cannot find -llapack
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: cannot find -lblas

我根据README文件取消了配置文件config.hpp的注释。

有人知道如何让犰狳工作吗? (我正在使用Eclipse CDT。)

3 个答案:

答案 0 :(得分:7)

需要一段时间才能做到这一点,但一旦工作就会显得透明。我会一步一步解释。 (确保已按照config.hpp文件的README中的指示取消注释正确的行)

使用blas / lapack进行编译的一般命令(使用默认的armadillo(当前版本4.500.0)并使其更快:)

g ++ main.cpp -I C:{ARMADILLO_ROOT} \ include -L C:{ARMADILLO_ROOT} \ examples \ lib_win64 -lblas_win64_MT -llapack_win64_MT

其中每个命令如下:

  1. g ++ :GNU G ++编译器(使用Equationsolution.com的MinGW 4.9.1 C ++)

  2. main.cpp :我的C ++程序的主文件(我有一个定义Levenshtein算法的抽象和具体的类)

  3. -IC:{ARMADILLO_ROOT} \ include :GCC C ++编译器包含路径(包含Armadillo库),其中ARMADILLO_ROOT是您解压缩并放置犰狳文件的位置

  4. -LC:{ARMADILLO_ROOT} \ examples \ lib_win64 :MinGW C ++链接库链接路径(链接BLAS和LAPACK库)我使用了armadillo提供的默认库,我相信,根据文档,您可以并且应该在生产实例中替换这些线性库)

  5. -lblas_win64_MT -llapack_win64_MT :确定要使用的库(名称必须匹配,因此您不能放-lblas或-llapack,除非您的文件以这种方式命名 - 默认情况下在此犰狳版本名为blas_win64_MT lapack_win64_MT(win64,因为我使用的是MinGW / C ++ 64位和64位犰狳[它们应该匹配])

  6. 遵循这个逻辑,您可以使用以下命令配置eclipse(使用eclipse Luna R1 4.4.1 - 应该是与其他版本相同的过程):

    • 右键单击项目并选择"属性"弹出菜单中的项目
    • " C / C ++ Build"在左侧菜单中选择"设置"
    • " GCC C ++编译器"点击"包含(-I)"并添加包含路径 C:{ARMADILLO_ROOT} \ include (截图1)
    • 在" MinGW C ++ Linker"点击"图书馆"添加每个"库(-l)"名为 blas_win64_MT lapack_win64_MT 。 (Screenshot2)
    • 在相同的" MinGW C ++ Linker"点击"图书馆"添加"库搜索路径(-L)"的 C:{ARMADILLO_ROOT} \例子\ lib_win64
    • 点击"应用"按下"确定"
    • 之前的按钮

    - Screenshot1 Screenshot1

    - Screenshot2 Screenshot2

答案 1 :(得分:3)

现在似乎工作了!我正在使用自述文件中指示的网页中的Lapack和BLAS,我根据@enhzflep评论自行编译。

要在Eclipse CDT中正确链接所有内容,请右键单击项目并转到属性,然后:

  1. " C / C ++Build⟼Settings⟼GCCC++Compiler⟼Command"键入:g++ -I"C:\Armadillo\include"(替换为Armadillo文件夹的正确路径)。确保对所有配置执行此操作(在顶部的下拉菜单中选择)。
  2. " C / C ++Build⟼Settings⟼MinGWC++Linker⟼Libraries"将lapackblas添加到库中。
  3. " C / C ++General⟼Paths和Symbols⟼GNUC++"添加Armadillo文件夹include的{​​{1}}目录路径。
  4. 它可能与原始的Lapack和BLAS文件一起使用。它对我来说不起作用,因为我只是在#C; C ++General⟼Paths和Symbols⟼GNUC++"下添加了Armadillo的路径,我想这只能告诉编辑器什么数据类型和函数是期望而不是编译器。

答案 2 :(得分:2)

如果您在Windows上使用MinGW,一个不错的选择是将OpenBLAS与Armadillo一起使用。 OpenBLAS提供BLAS和LAPACK的优化和多线程实现: http://xianyi.github.io/OpenBLAS/

OpenBLAS项目为Windows提供预编译版本。源代码也可以在Linux和MacOS X下轻松编译。

请注意,Armadillo不支持Windows下的自动安装。基于cmake的安装程序提供了一个很大的警告信息 - 你建议你注意它。

而不是自动安装,请执行以下操作(如Armadillo附带的README.txt文件中所述):

  1. 手动修改include/armadillo_bits/config.hpp以启用BLAS和LAPACK。换句话说,请确保ARMA_USE_BLASARMA_USE_LAPACK取消注释(已启用)。

  2. 同样在include/armadillo_bits/config.hpp范围内,请停用ARMA_USE_WRAPPER,即。确保它已被注释掉。

  3. 编译C ++程序时,请告诉编译器直接使用armadillo include文件夹,并与openblas链接。例如,使用gcc使用-I开关指定包含文件夹。