我正在尝试让ARPACK
库在VS2010
上运行。
我想使用C ++包装器
由ARPACK
++提供(一些背景 - 我需要得到巨大矩阵的特征值和特征向量)。关于这个主题有一个非常好的教程here。
继续
教程我已经设法在g77
上使用mingw
编译fortran代码,我成功生成了
所描述的dll和lib。尝试将我的visual studio项目链接到库时会出现问题。
我试图链接的方式如下:
当我尝试编译这个简短的测试代码时,尽管有这些设置:
#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 ++应用程序链接。我想我现在应该写一个关于如何做到这一点的教程:)
答案 0 :(得分:0)
我的猜测是,这是一个名称错误的计划问题。在fortran中,没有很好地定义符号在目标文件的符号表中的名称。例如,名为foo
的例程可能会在符号表中以foo
,FOO
,foo_
,foo__
等结束。这些天,我不知道有太多使用双下划线的编译器(g77是例外)。我假设ARPACK ++包装器假设一个下划线。这里的解决方案是告诉编译器在符号名称中使用单个下划线(使用g77
,这意味着使用-fno-second-underscore
)。请注意,gfortran
是一个较新的(仍受支持的)开源fortran编译器,默认情况下会执行单个下划线。您可能也想尝试使用该编译器构建代码。 (它可能产生比g77更优化的输出。)