2009-08-28 105 views
4

MPICH2安裝在C:\ Program Files \ MPICH2中。有兩個子目錄(感興趣的),其中包含.h文件的\include,以及包含.lib文件的\libMinGW鏈接器找不到MPICH2庫

附帶MPICH2有以下說明自述:

  1. 創建一個makefile
  2. 添加–I...mpich2\include
  3. 添加–L...mpich2\lib
  4. 添加–lmpi
  5. 添加規則的源文件
  6. 編譯

由於在我的項目沒有其他的規則,我不創建一個makefile,我只是去命令行和嘗試編譯如下:

g++ -I"C:\Program Files\MPICH2\include" main.cpp -L"C:\Program Files\MPICH2\lib" -lmpi 

這給我的undefined reference一大把代碼中每個單個MPI符號上的錯誤。我花了幾個小時試圖修復它,將玩家-I,-L-l切換,混洗參數的順序,甚至將所有.lib文件複製到我的源代碼所在的目錄中,但似乎沒有任何效果。

需要什麼樣的巫術才能讓這件事鏈接?


編輯:我想我找到了問題:這裏的詳細方式連接器輸出的(增加-Wl,--verbose到編譯命令)的摘錄:

attempt to open C:\Program Files\MPICH2\lib/libmingwex.dll.a failed 
attempt to open C:\Program Files\MPICH2\lib/mingwex.dll.a failed 
attempt to open C:\Program Files\MPICH2\lib/libmingwex.a failed 
attempt to open C:\Program Files\MPICH2\lib/mingwex.lib failed 
attempt to open C:\Program Files\MPICH2\lib/libmingwex.dll failed 
attempt to open C:\Program Files\MPICH2\lib/mingwex.dll failed 
attempt to open C:\Program Files\MPICH2\lib\libmingwex.a failed 

顯然,鏈接器添加了/代替\到我提供的目錄名稱(因爲某些原因尋找lib___.a格式時除外),這顯然不是有效的路徑。有什麼辦法可以告訴鏈接器使用反斜槓而不是斜槓嗎?

這也引起了我的注意:

attempt to open /mingw/lib/libmingwex.a succeeded 

所以,我想編寫這樣的:

g++ -I"/Program Files/MPICH2/include" -L"/Program Files/MPICH2/lib" objManager.cpp ongom.cpp io.cpp main.cpp -lmpi -lcxx 

但我仍然得到同樣的錯誤undefined reference

+0

介意發佈編譯器/鏈接器日誌? –

+0

真的沒有什麼可看的,它只有幾十行,如下所示:'C:\ Users \ Bansaghi \ AppData \ Local \ Temp/ccIF61Uc.o:main.cpp :(。text + 0x1615):未定義的引用'MPI_Comm_rank '' – suszterpatt

回答

1

嘗試添加-lmpicxx(該lib爲C++綁定),並確保-l...來自的cpp源文件*。這個工作對我來說:

g++ -Iinclude -Llib test/cxxpi.cpp -lmpicxx -lmpi 

編輯:回覆:「未定義的引用‘MPI_Comm_rank’」:會不會是你的混淆/使用C /而不是C++和? MPI_Comm_rankseems to be c綁定 - C++綁定將是MPI::Comm::Get_rank()。也許嘗試編譯你的程序爲c,或者,如果你想使用C++,使用適當的綁定(見示例dir中的cxxpi.cpp)?

* http://newsgroups.derkeiler.com/Archive/Comp/comp.parallel.mpi/2006-08/msg00036.html

+0

即使我添加了每個庫,並將所有參數與您寫入的順序完全相同,仍然會收到「未定義的引用」錯誤。 – suszterpatt

+0

你讀過我的編輯了:c還是C++綁定?另外,請嘗試使用正斜槓,相對路徑,並且路徑名中沒有空格。例如。把你的源代碼放到「C:\ Program Files \ MPICH2 \ sc」中,最後使用-I ../ include -L ../ lib等等,它對我來說很有用...... –

+0

哦,順便說一下:鏈接器查找libmpi.a和(如果它是C++)libmpicxx.a - 這就是爲什麼-lmpicxx -lmpi。 –

0

我曾與MinGW的一個類似的問題:對於具有的.lib結尾的庫文件,我不得不把庫的名字沒有結尾(例如-llibboost_system-mgw34-MT當filename是libbboost_system-mgw34-mt.lib)。對於以.a結尾的庫文件,我必須將庫的名稱放在起始「lib」和尾部.a(例如libws2_32.a的-lws2_32)之外。

因此,在你的情況 - 嘗試-llibmpi(或不管你的文件被稱爲沒有.lib結尾),也許這是同樣的問題。


從:http://www.mingw.org/node/98/revisions/358/view

注意:某些路徑被印有「/」作爲路徑分隔符,而另一些被印有「\」作爲路徑分隔。因爲MinGW GCC同時接受兩者,所以我用「/」替代了所有。

所以我不會花太多時間找到一種方法來糾正路徑分隔符。你的圖書館是否爲mingw編譯?

也許:http://www.mingw.org/wiki/LibraryPathHOWTO可以幫助你更進一步。

+0

顯然,鏈接器嘗試各種格式,但創建了錯誤的路徑:請參閱我的編輯問題。 – suszterpatt

+0

你能告訴我mpi-libarary文件的名字嗎?它是libmpi.a還是libmpi.lib?這很重要,因爲如果你想鏈接到l​​ibmpi.lib文件,你需要-llibmpi而不是-lmpi –

+0

這些文件沒有''''前綴,並且擴展名爲'.lib'。例如'mpi.lib'和'cxx.lib'。查看上面的詳細輸出,選項'-lmpi'應該嘗試查找'mpi.lib'(按照摘錄中的第4行)。 – suszterpatt

3

GCC 能夠找到您的圖書館。否則它會報告:cannot find -lmpi

不知何故發生例程在該庫中找不到。我設法用這個語法來編譯一個例子:

g++ -I../include cpilog.c ../lib/mpi.lib ../lib/mpe.lib 

我在msys裏面做了這些。而我的目錄不包含空格。

刪除libmpi.a文件後,這也適用:

g++ -I../include -L../lib cpilog.c -lmpi -lmpe 
1

我從鏈接32位目標文件和64位MPICH庫造成類似的問題。與32位libmpi.a鏈接解決了這個問題。