c++ - 从VS2010链接到ARPACK

标签 c++ linker fortran arpack

我正在尝试使ARPACK库在VS2010上运行。

我想使用C++包装器
ARPACK ++提供(某些背景-我需要获取巨大矩阵的特征值和特征 vector )。关于here这个主题有一个很好的教程。


我已经成功地使用g77上的mingw编译了本教程的教程
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。我想我现在应该去写一个关于如何做到这一点的教程:)

  • 最佳答案

    我的猜测是这是一个名称处理方案问题。在fortran中,没有很好定义在目标文件的符号表中符号将具有的名称。例如,名为foo的例程可能会以fooFOOfoo_foo__等结尾在符号表中。这些天来,我不知道有太多使用双下划线的编译器(g77是异常(exception))。我假设ARPACK ++包装器假设一个下划线。此处的解决方案是告诉编译器在符号名称中使用单个下划线(使用g77,这意味着使用-fno-second-underscore)。请注意,gfortran是较新的(仍受支持)开源的fortran编译器,默认情况下执行单下划线。您可能还想尝试使用该编译器来构建代码。 (它可能产生比g77更优化的输出。)

    关于c++ - 从VS2010链接到ARPACK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11722826/

    相关文章:

    Fortran 执行时间

    fortran - 在模块中使用外部函数

    python - PyTorch C++扩展:如何索引张量并更新它?

    c++ - 我可以指定我的 C++ 程序监听哪个 HID 吗?

    c++ - 使用 CMake 与其他静态库链接的静态库 - 一个有效,一个无效。为什么?

    linker - 在 Linux 上使用 GNU makefile 链接 protobuf 库

    c++ - 如何读取nm命令: What does nm options -T and -U (undefined) mean?

    Fortran 命名空间(或代码组织)

    C++从图像中获取对像素数组的引用

    c++ - std::thread with pthread_setschedparam with c++ 11