【问题标题】:Linking to ARPACK from VS2010从 VS2010 链接到 ARPACK
【发布时间】:2012-07-30 13:43:53
【问题描述】:

我正在尝试让 ARPACK 库在 VS2010 上运行。

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

遵循 教程我已经设法在mingw 上使用g77 编译fortran 代码,我成功生成 所描述的 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 文件确实提到了所有这些功能 所以我相当确定它们应该可用。不过,我觉得我遗漏了一些明显的东西。

更新(让它工作!):

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

【问题讨论】:

    标签: c++ linker fortran arpack


    【解决方案1】:

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

    【讨论】:

    • 问题是从 64 位程序链接到 32 位 dll。我确实让它工作了(见编辑)。感谢您推荐 gfortran,它工作得非常好,我在 Windows 上使用生成的 dll 完全没有问题。
    • @user1563071 -- 如果你得到了它的工作,请随时自己发布你的问题的答案(并在你有能力的时候接受它)。这样,如果其他人遇到相同的问题并在 Google 搜索中找到这些答案,他们将能够看到对您有用的方法(非常突出)。
    猜你喜欢
    • 1970-01-01
    • 2012-01-24
    • 2012-08-12
    • 2014-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 2011-11-23
    相关资源
    最近更新 更多