2012-07-30 30 views
1

我想让ARPACK库在VS2010上运行。我想用ARPACK ++提供的C++包装 ++(一些背景 - 我需要得到巨大矩阵的特征值和特征向量)。关于这个问题有一个非常好的教程here链接到VS2010的ARPACK

继 教程中,我已经成功地汇编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文件确实提到所有这些功能 因此我相当确定它们应该可用。不过,我觉得我失去了一些明显的东西。

UPDATE(得到它的工作!):

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

回答

0

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

+0

问题是从64位程序链接到32位DLL。我确实得到它的工作(见编辑)。感谢您提供gfortran,它运行得非常好,我在使用Windows上生成的dll时完全没有问题。 – Silentbit 2012-07-31 22:08:17

+0

@ user1563071 - 如果你的工作有效,可随时发布自己的问题答案(并在你有能力时接受)。这样,如果他们遇到同样的问题并在谷歌搜索中找到这些答案,其他人将能够看到对您有用的东西(非常显着)。 – mgilson 2012-08-01 01:45:57