我正在尝试让ARPACK库在VS2010上运行。
我想使用C++包装提供的ARPACK++ (一些背景-我需要得到特征值和特征向量的巨大矩阵)。有一个关于主题这里的非常好的教程。
在本教程之后,我在mingw上使用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文件确实提到了所有这些函数,所以我相当肯定它们应该是可用的。不过,我觉得我错过了一些显而易见的东西。
更新(让它正常工作!):
结果是,我试图将64位程序链接到32位库,在配置设置中切换到x86,并将生成的def文件包含在Configuration Properties -> Linker -> Input ->附加定义文件中,它可以用于32位(但我需要64位)。最后一个对我有用的解决方案是在linux上使用Win64和gfortran交叉编译它。这是令人惊讶的好工作,并产生了一个dll,我可以从一个64位的C++应用程序链接到VS。我想我现在应该写一篇关于如何做到这一点的教程:)
发布于 2012-07-30 15:09:51
我猜这是个名不副实的计划问题。在fortran中,没有很好地定义对象文件的符号表中符号的名称。例如,名为foo的例程可能在符号表中以foo、FOO、foo_、foo__等形式结束。最近,我不知道有太多编译器使用双下划线( g77除外)。我假设ARPACK++包装器是一个单独的下划线。这里的解决方案是告诉编译器在符号名中使用单个下划线(使用g77,这意味着使用-fno-second-underscore)。请注意,gfortran是一个新的(仍然受支持的)开源fortran编译器,默认情况下只做单一的评分。您可能也希望尝试使用该编译器构建代码。(它可能产生比g77更优化的输出。)
https://stackoverflow.com/questions/11722826
复制相似问题