2012-07-30 61 views
1

我想讓ARPACK庫在VS2010上運行。我想用ARPACK ++提供的C++包裝 ++(一些背景 - 我需要得到巨大矩陣的特徵值和特徵向量)。關於這個問題有一個非常好的教程here鏈接到VS2010的ARPACK

繼 教程中,我已經成功地彙編mingw使用g77的Fortran代碼,描述我成功生成 的dll和lib。試圖將我的Visual Studio項目鏈接到庫時出現問題。

我試圖聯繫方式如下:

  1. 我做了一個簡單的VS2010 C++控制檯應用程序
  2. 我已經添加了含ARPACK ++庫文件夾到我的「額外包括:文件夾」
  3. 我添加的lib文件到‘附加依賴’
  4. 我加方含的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文件確實提到所有這些功能 因此我相當確定它們應該可用。不過,我覺得我失去了一些明顯的東西。

UPDATE(得到它的工作!):

事實證明,我試圖切換 當在配置設置的x86的64位程序鏈接到32位庫,包括產生的DEF文件在配置屬性 - >鏈接器 - >輸入 - >附加定義文件,它適用於32位(但我需要64)。對我來說最終的解決方案是在Linux上使用MinGW和gfortran對Win64進行交叉編譯。這工作出人意料地好,併產生了一個DLL,我可以從VS中的64位C++應用程序鏈接。我想我現在應該去寫一個關於如何做到這一點的教程:)

回答

0

我的猜測是,這是一個名稱mangling計劃問題。在fortran中,沒有很好地定義符號在對象文件符號表中的名稱。例如,名爲foo的例程可以在符號表中以fooFOO,foo_foo__等結束。現在,我不知道有太多使用雙下劃線的編譯器(g77是例外)。我假設ARPACK ++包裝器假設一個下劃線。這裏的解決方案是告訴編譯器在符號名稱中使用單個下劃線(使用g77,這意味着使用-fno-second-underscore)。請注意,gfortran是一個較新的(仍支持)開源Fortran編譯器,默認情況下會進行單一下劃線。您也可以嘗試使用該編譯器構建代碼。 (它可能產生比g77更優化的輸出。)

+0

問題是從64位程序鏈接到32位DLL。我確實得到它的工作(見編輯)。感謝您提供gfortran,它運行得非常好,我在使用Windows上生成的dll時完全沒有問題。 – Silentbit 2012-07-31 22:08:17

+0

@ user1563071 - 如果你的工作有效,可隨時發佈自己的問題答案(並在你有能力時接受)。這樣,如果他們遇到同樣的問題並在谷歌搜索中找到這些答案,其他人將能夠看到對您有用的東西(非常顯着)。 – mgilson 2012-08-01 01:45:57