2016-01-05 75 views
2

我無法在Visual Studio 2013中爲64位平臺編譯介紹性的Lapack代碼。什麼,我試圖做總結:鏈接LAPACK,64位,Visual Studio 2013

  • 獲取LAPACK並支持64位C++運行的軟件,我在Visual Studio 2013年寫
  • 我用在給定方向相同按照使用預建庫(* .dll,* .lib & * .h)的方法,並引用我構建的庫中的指令。

Visual Studio的步驟我走:

  • 我開始一個新項目 - 採摘的Visual C++空項目模板
  • 在項目屬性中,我第一次去配置管理器,並創建一個新的x64的解決方案平臺(複製Win32設置)
  • 然後,對於所有配置和所有平臺,我將鏈接器附加庫依賴關係指向我將預構建的* .lib文件放置到的位置。我也添加到鏈接器=>按照指示輸入libblas.lib和liblapack.lib庫。
  • 注意1:我沒有添加任何Lapacke的東西,因爲我不相信我試圖運行的簡單示例程序需要這些東西(並且添加這些路徑在以前的嘗試中似乎沒有幫助)
  • 注2:我知道我下載的庫只有64位 - 但我將這些項目屬性應用於'所有平臺'(意思是包括32位平臺)以演示某些內容,如下所示...
  • 然後在Visual Studio中,我用www.cs.rochester.edu/~bh/cs400/using_lapack.html提供的代碼添加了一個C++源文件'source.cpp'。下面的代碼

#include < stdio.h> 

extern "C" void dgesv_(const int *N, const int *nrhs, double *A, const int *lda, int *ipiv, double *b, const int *ldb, int *info); 
extern "C" void dgels_(const char *trans, const int *M, const int *N, const int *nrhs, double *A, const int *lda, double *b, const int *ldb, double *work, 
const int * lwork, int *info); 

int main(void) 
{ 
    double A[9] = { 76, 27, 18, 25, 89, 60, 11, 51, 32 }; 
    double b[3] = { 10, 7, 43 }; 

    int N = 3; 
    int nrhs = 1; 
    int lda = 3; 
    int ipiv[3]; 
    int ldb = 3; 
    int info; 

    dgesv_(&N, &nrhs, A, &lda, ipiv, b, &ldb, &info); 

    if (info == 0) /* succeed */ 
     printf("The solution is %lf %lf %lf\n", b[0], b[1], b[2]); 
    else 
     fprintf(stderr, "dgesv_ fails %d\n", info); 

    return info; 
} 
  • 然後我嘗試編譯這個程序(在Debug或Release配置) - 爲x64平臺並且得到錯誤:

error LNK2019: unresolved external symbol dgesv_ referenced in function main

這似乎表明預建的庫不包含這些功能。

  • 非常奇怪的是,如果我將平臺更改爲'win32',項目編譯! (呵?)所以它爲32位平臺找到這些庫。 (順便說一句,如果我嘗試運行那裏產生的可執行文件,我得到一個錯誤,一個* .dll文件丟失 - 因爲我只下載了64位庫,這並不奇怪...)

此外,在代碼也dgesv_前添加下劃線似乎不工作 - 給我在編譯時錯誤:

fatal error LNK1112: module machine type 'X86' conflicts with target machine type 'x64'

這也與一些討論在icl.cs.utk.edu/lapack-跟蹤論壇/ viewtopic.php?F = 12 & T = 4260

同樣,這整個問題似乎在http://icl.cs.utk.edu/lapack-forum/viewtopic.php?f=12&t=4260和鄉親那裏追蹤的討論似乎表明,自行構建圖書館與CMake的是一個解決方案(我想這一點,但運行到問題的存在它沒有找到在MinGW的-W64庫正確的Fortran編譯器,我下載< =這可能適用於不同的職位!)。更重要的是,在該線程的帖子的最後,「管理員」表示,他們以前糾正任何問題,這些預建libaries,他們應該現在的工作。所以我必須做一些不正確的事,對嗎?有沒有人在我使用的工作流程中看到問題?

回答

1

我的工作多一些關於這個(與上LAPACK論壇的一些人接口)。有兩個職位沒有描述的細節: