【问题标题】:How to make Armadillo work on Windows?如何让犰狳在 Windows 上工作?
【发布时间】:2014-08-24 07:28:27
【问题描述】:

我无法让 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。)

【问题讨论】:

  • 您是否将 liblpack.a 和 libblas.a 文件复制到 MinGW 安装的 lib 文件夹中?如果您不这样做,则需要通过-L--library-path 开关告诉g++(实际上是ld)它们位于哪个文件夹中。如果你输入ld --help,你可以看到这个
  • @enhzflep 当我从here 下载犰狳(和 lapack)时,没有 liblapck.a 文件,也没有 libblas.a。我在哪里可以找到它们?我确实使用-L 开关告诉 g++ 在哪里寻找 lapack.lib 和 blas.lib。
  • 刚刚下载了犰狳并查看了包含的文件。我看到它包含用于 x64 窗口的预编译库 - 尽管适用于 Visual Studio。在那种情况下,我猜你有很多选择。 1. 您可以下载 blas 和 lapack 源代码,然后使用 minGW 自己构建它们(下载位置在 Readme.txt 文件中)2. 您可以使用 dlltool mingw 附带的程序,用于从您拥有的 DLL 文件生成导入库。我不知道这是否是一个有效的选项,因为 DLL 是 x64 并且您使用的是 MinGW32。尝试#1
  • @enhzflep 我构建了源代码,现在有了 liblapack.a 和 libblas.a 文件。我试图链接到它们并将文件添加到 MinGW 的 lib 文件夹中,两次都没有成功。我仍然从原来的帖子中得到第一个错误。
  • 构建 2 个库或测试应用程序现在不是我的选择。抱歉,不确定什么问题出在哪里。

标签: c++ lapack mingw32 blas armadillo


【解决方案1】:

花了一些时间才把它弄好,但它一旦起作用就显得透明了。我将逐步解释。 (确保您已按照 config.hpp 文件的 README 中的指示取消注释正确的行)

使用 blas/lapack 编译的通用命令(使用犰狳提供的默认值(当前版本 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. ma​​in.cpp:我的 C++ 程序主文件(我有一个定义 Levenshtein 算法的抽象和具体类)

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

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

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

按照这个逻辑,你可以配置 eclipse(使用 eclipse Luna R1 4.4.1 - 其他版本应该是相同的过程):

  • 右键单击项目并在弹出菜单中选择“属性”项
  • 在左侧菜单的“C/C++ Build”下选择“设置”
  • 在“GCC C++ 编译器”下单击“包含 (-I)”并添加包含路径 C:{ARMADILLO_ROOT}\include(屏幕截图 1)
  • 在“MinGW C++ 链接器”下,单击“库”添加每个名为 blas_win64_MT lapack_win64_MT 的“库 (-l)”。 (截图2)
  • 在同一个“MinGW C++ Linker”下点击“Libraries”添加一个“Library search path (-L)”C:{ARMADILLO_ROOT}\examples\lib_win64
  • 在按“确定”之前单击“应用”按钮

--截图1

--截图2

【讨论】:

  • 真的非常感谢。经过几天和几天的搜索,这就是帮助我让它工作的原因。感谢您花时间写出如此详细的答案!
【解决方案2】:

现在好像可以了!我正在使用我根据@enhzflep cmets 自己编译的自述文件中指示的网页中的 Lapack 和 BLAS。

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

  1. 在“C/C++ Build⟼Settings⟼GCC C++ Compiler⟼Command”下键入:g++ -I"C:\Armadillo\include"(替换为 Armadillo 文件夹的正确路径)。确保对所有配置执行此操作(在顶部的下拉菜单中选择)。
  2. 在“C/C++ Build⟼Settings⟼MinGW C++ Linker⟼Libraries”下,将 lapackblas 添加到库中。
  3. 在“C/C++ 常规⟼路径和符号⟼GNU C++”下,将路径添加到您的犰狳文件夹C:\Armadillo\includeinclude 目录中。

它可能适用于原始的 Lapack 和 BLAS 文件。它对我不起作用,因为我只在“C/C++ General⟼Paths and Symbols⟼GNU C++”下添加了 Armadillo 的路径,我猜这只会告诉编辑器期望的数据类型和函数,而不是编译器。

【讨论】:

    【解决方案3】:

    如果您在 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 开关来指定包含文件夹。

    【讨论】:

    • 我在您发布的链接上没有找到任何适用于 Windows 的预编译版本。我跟着README.txt 并认为我没有任何问题,包括犰狳,因为错误消息说:In function ZN4arma4blas3dotIdEET_jPKS2_S4_': C:/Armadillo/include/armadillo_bits/blas_wrapper.hpp:183: undefined reference to @987654333 @。我怀疑我无法正确链接到 Lapack 和 BLAS。
    • 如果前面的wrapper_ 出现任何错误,这意味着您仍然启用了ARMA_USE_WRAPPER。如上所述,禁用它。此外,OpenBLAS 预编译版本的链接位于该页面的 Binary Packages 下。它指向:sourceforge.net/projects/openblas/files
    猜你喜欢
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 2015-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多