链接到VS2010的ARPACK

时间:2012-07-30 13:43:54

标签: c++ linker fortran arpack

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

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

继续 教程我已经设法在g77上使用mingw编译fortran代码,我成功生成了 所描述的dll和lib。尝试将我的visual studio项目链接到库时会出现问题。

我试图链接的方式如下:

  1. 我制作了一个简单的VS2010 C ++控制台应用
  2. 我已将包含ARPACK ++库的文件夹添加到我的“其他包含文件夹”
  3. 我已将lib文件添加到“Additional dependencies”
  4. 我已将包含lib文件的目录添加到我的“其他库目录”
  5. 当我尝试编译这个简短的测试代码时,尽管有这些设置:

    #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文件确实提到了所有这些函数 所以我很确定它们应该可用。不过,我觉得我错过了一些明显的东西。

    更新(让它工作!):<​​/ p>

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

1 个答案:

答案 0 :(得分:0)

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