2

我正在尝试让ARPACK库在VS2010.

我想使用 ++ 提供的 C++ 包装器ARPACK(一些背景 - 我需要获取巨大矩阵的特征值和特征向量)。这里有一个很好的关于这个主题的教程

按照教程,我设法使用g77on编译了 fortran 代码mingw,我成功地生成了所描述的 dll 和 lib。尝试将我的 Visual Studio 项目链接到库时出现问题。

我试图链接的方式如下:

  1. 我制作了一个简单的 VS2010 C++ 控制台应用程序
  2. 我已将包含 ARPACK++ 库的文件夹添加到我的“其他包含文件夹”中
  3. 我已将 lib 文件添加到“其他依赖项”
  4. 我已将包含 lib 文件的目录添加到我的“其他库目录”中

尽管有这些设置,当我尝试编译这个简短的测试代码时:

#include "stdafx.h"
#include "arrsnsym.h"

int _tmain(int argc, _TCHAR* argv[])
{
    ARrcNonSymStdEig<float> prob(100, 4L);
    printf("Bok!");
    return 0;
}

我收到一条错误消息:

>arpackcpp.obj : error LNK2001: unresolved external symbol scopy_
1>arpackcpp.obj : error LNK2001: unresolved external symbol snaupd_
1>arpackcpp.obj : error LNK2001: unresolved external symbol sneupd_

我不明白为什么链接器找不到上述方法。检查 dllwrap 实用程序生成的 .def 文件确实提到了所有这些功能,所以我相当确定它们应该可用。不过,我觉得我错过了一些明显的东西。

更新(让它工作!):

事实证明,当在配置设置中切换到 x86 并在配置属性-> 链接器-> 输入-> 附加定义文件中包含生成的 def 文件时,我试图将 64 位程序链接到 32 位库,它起作用了对于 32 位(但我需要 64 位)。对我有用的最终解决方案是在 Linux 上使用 MinGW 和 gfortran 为 Win64 交叉编译它。效果出奇的好,并生成了一个 dll,我可以从 VS 中的 64 位 C++ 应用程序链接到该 dll。我想我现在应该去写一个关于如何做到这一点的教程:)

4

1 回答 1

0

我的猜测是这是一个名称修改方案问题。在 fortran 中,没有很好地定义符号在目标文件的符号表中的名称。例如,一个名为的例程foo可能在符号表中以fooFOOfoo_等结尾foo__。这些天来,我不知道有太多使用双下划线的编译器(g77 除外)。我假设 ARPACK++ 包装器假设一个下划线。此处的解决方案是告诉编译器在符号名称中使用单个下划线(使用g77,表示使用-fno-second-underscore)。注意gfortran是一个较新的(仍然受支持的)开源 fortran 编译器,默认情况下使用单下划线。您可能还想尝试使用该编译器构建代码。(它可能会产生比 g77 更优化的输出。)

于 2012-07-30T15:09:51.990 回答