【发布时间】:2012-07-30 13:43:53
【问题描述】:
我正在尝试让 ARPACK 库在 VS2010 上运行。
我想使用 C++ 包装器
由ARPACK++ 提供(一些背景——我需要获取巨大矩阵的特征值和特征向量)。关于这个主题有一个非常好的教程here。
遵循
教程我已经设法在mingw 上使用g77 编译fortran 代码,我成功生成
所描述的 dll 和 lib。尝试将我的 Visual Studio 项目链接到库时出现问题。
我尝试链接的方式如下:
- 我制作了一个简单的 VS2010 C++ 控制台应用程序
- 我已将包含 ARPACK++ 库的文件夹添加到我的“其他包含文件夹”中
- 我已将 lib 文件添加到“附加依赖项”中
- 我已将包含 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 文件确实提到了所有这些功能 所以我相当确定它们应该可用。不过,我觉得我遗漏了一些明显的东西。
更新(让它工作!):
事实证明,我在切换时试图将 64 位程序链接到 32 位库 到配置设置中的 x86 并在配置属性 -> 链接器 -> 输入 -> 附加定义文件中包括生成的 def 文件,它适用于 32 位(但我需要 64 位)。对我有用的最终解决方案是在 Linux 上使用 MinGW 和 gfortran 为 Win64 交叉编译它。效果出奇的好,并生成了一个 dll,我可以从 VS 中的 64 位 C++ 应用程序链接到该 dll。我想我现在应该去写一个关于如何做到这一点的教程:)
【问题讨论】: