[英]Linking to ARPACK from VS2010
我试图让ARPACK
库在VS2010
上运行。
我想使用ARPACK
++提供的C ++包装器(某些背景-我需要获取巨大矩阵的特征值和特征向量)。 有关于这个问题的一个很好的教程在这里 。
遵循该教程,我设法在mingw
上使用g77
编译了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文件确实确实提到了所有这些功能,因此我相当确定它们应该可用。 但是,我仍然感觉缺少明显的东西。
更新(使其正常工作!):
原来,当我在配置设置中切换到x86并在配置属性->链接器->输入->附加定义文件中包括生成的def文件时,我试图将64位程序链接到32位库。为32位(但是我需要64位)。 对我有用的最终解决方案是在Linux上使用MinGW和gfortran对Win64进行交叉编译。 效果出奇的好,并生成了一个dll,我可以从VS中的64位C ++应用程序链接到该dll。 我想我现在应该去写一个关于如何做到这一点的教程:)
我的猜测是这是一个名称处理方案问题。 在fortran中,没有很好定义在目标文件的符号表中符号将具有的名称。 例如,名为foo
的例程可能会在符号表中最终显示为foo
, FOO
, foo_
, foo__
等。 这些天来,我不知道有太多使用双下划线的编译器(g77是例外)。 我假设ARPACK ++包装器假设一个下划线。 此处的解决方案是告诉编译器在符号名称中使用单个下划线(对于g77
,这意味着使用-fno-second-underscore
)。 请注意, gfortran
是较新的(仍受支持)开源的fortran编译器,默认情况下会进行单下划线。 您可能还想尝试使用该编译器来构建代码。 (它可能产生比g77更优化的输出。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.