我正在尝试使ARPACK
库在VS2010
上运行。
我想使用C++包装器
由ARPACK
++提供(某些背景-我需要获取巨大矩阵的特征值和特征 vector )。关于here这个主题有一个很好的教程。
继
我已经成功地使用g77
上的mingw
编译了本教程的教程
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文件确实提到了所有这些功能
因此,我相当确定它们应该可用。不过,我仍然感觉缺少明显的东西。
更新(让它正常工作!):
原来,我在切换时试图将64位程序链接到32位库
到配置设置中的x86,并在配置属性->链接器->输入->其他定义文件中包括生成的def文件,它适用于32位(但是我需要64位)。对我有用的最终解决方案是在Linux上使用MinGW和gfortran对Win64进行交叉编译。那工作出奇地好,并生成了一个dll,我可以从VS中的64位C++应用程序链接到该dll。我想我现在应该去写一个关于如何做到这一点的教程:)
最佳答案
我的猜测是这是一个名称处理方案问题。在fortran中,没有很好定义在目标文件的符号表中符号将具有的名称。例如,名为foo
的例程可能会以foo
,FOO
,foo_
,foo__
等结尾在符号表中。这些天来,我不知道有太多使用双下划线的编译器(g77是异常(exception))。我假设ARPACK ++包装器假设一个下划线。此处的解决方案是告诉编译器在符号名称中使用单个下划线(使用g77
,这意味着使用-fno-second-underscore
)。请注意,gfortran
是较新的(仍受支持)开源的fortran编译器,默认情况下执行单下划线。您可能还想尝试使用该编译器来构建代码。 (它可能产生比g77更优化的输出。)
关于c++ - 从VS2010链接到ARPACK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11722826/