1. 程式人生 > >iGraph演算法框架執行出錯及解決方案

iGraph演算法框架執行出錯及解決方案

1 介紹

我看了一篇論文[1],並向作者要了該論文的原始碼。該演算法框架是以Visual C++ console程式專案的形式提供的原始碼。我想執行一下作者提供的原始碼,雙擊GraphIndexing.sln 檔案進入這個演算法框架專案,我所使用的IDE 版本為VS2010。在VS2010的Solution view下設定啟動專案為CTree,然後Build,能成功,但是當Start without debugging時,程式不能執行,提供的錯誤資訊為圖1:

Figure 1: CTree 程式執行後的報錯資訊
既然提示說程式執行時缺少一個動態連結庫檔案(.dll檔案),我的第一個反應就是,搜尋我的電腦上是否存在該檔案。蒐集結果為在以下的三個資料夾中都存在這個檔案:
  •   ...\iGraphV1\TBB\ia32\vc7.1\bin
  •  ...\iGraphV1\TBB\ia32\vc8\bin
  •  ...\iGraphV1\TBB\ia32\vc9\bin
它們間的區別只是檔案的大小。不用做認真的分析,我們就應該知道,這三個同名的tbbmalloc proxy debug.dll 檔案是為不同版本的VS 編譯的專案所準備的。由於我利用的是VS2010,我想應該對應為vc9 資料夾下的那個檔案吧。於是,我就把tbbmalloc proxy debug.dll 及tbbmalloc proxy debug.pdb 這兩個檔案拷貝到CTree 可執行程式所在的Debug 資料夾,點選執行,還是沒有成功,如圖2提示:

Figure 2: 加入dll 檔案後,CTree 程式執行後的報錯資訊 按照上面的提示資訊在Google 上搜索解決方案,都不能解決問題。很快到了要吃午飯的時間。師弟提示我該吃飯了,於是我和他步行去一飯。在路上我和他聊了這個問題,他也給我了一些建議。在我們吃過免費贈送的湯圓後,我突然想到了問題的解決方案。原因是該專案所依賴的第三方包庫tbb...dll的版本不對,也就是說VS2010 不是對應的資料夾vc9 下的檔案。為了弄清VS 與vc 之間的對應關係,我整理出了上一篇博文《Visual studio IDE 與visual C++之間的對應關係(Correspondence)》,確定出了VS2010 與C10相對應。事實上,在作者提供的原始碼所依賴的第三方包庫TBB 資料夾下就沒有vc10 子資料夾,那該怎麼辦呢?

2 解決方案

從網站https://www.threadingbuildingblocks.org/download 上面下載Stable Release 版本tbb 4.3 Update 2,解壓縮下載的zip檔案,因為我使用的是32位的Win7 系統,所在從解壓縮後的資料夾tbb43 20141204\bin\ia32\vc10 下拷貝以下4個檔案:
  •  tbbmalloc proxy debug.dll
  •  tbbmalloc proxy debug.pdb
  •  tbbmalloc proxy.dll
  •  tbbmalloc proxy.pdb
到包含有可執行程式CTree.exe的資料夾Debug下,再次執行就成功了。
特別提示:在使用第三方庫tbb進行專案開發的時候,我們要用tbb提供的.lib檔案和.h檔案,而編譯好自己開發的專案後,執行可執行程式時,才需要dll檔案。這些檔案的地位和作用要弄清楚。

3 反思

遇到一個問題是要淡定,不要灰心喪氣。在網路上搜索別人的解決方案時,一定要根據自己的情況加進自己的理解和思考,這樣才能有效的解決問題。事實上,該問題的產生根源是作者開發時,在當時的時間段最新版本的Visual Studio 只能是2008,而在現在,大部分人至少在使用VS2010,所以造成了依賴的第三方包庫的版本匹配問題。

References

[1] Wook-Shin Han, Jinsoo Lee, Minh-Duc Pham, and Jeffrey Xu Yu. igraph: A framework for comparisons of disk-based graph indexing techniques. PVLDB, 3(1):449–459, 2010.