繁体   English   中英

从VS2010链接到ARPACK

[英]Linking to ARPACK from VS2010

我试图让ARPACK库在VS2010上运行。

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

遵循该教程,我设法在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文件确实确实提到了所有这些功能,因此我相当确定它们应该可用。 但是,我仍然感觉缺少明显的东西。

更新(使其正常工作!):

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM