2012-09-26 58 views
1

我試圖在xcode 4中運行一些MPI程序。我通過輸入sudo port install openmpi從MacPort安裝了openmpi,安裝正常完成。然後,我在我的用戶頭搜索路徑中添加了opt/local/include/openmpi,將「libmpi.dylib」和「libmpi_cxx.dylib」拖到我的項目中。如何爲xcode安裝Openmpi?

但後來,當我試圖運行程序時,我得到了以下錯誤消息:

Undefined symbols for architecture x86_64: 
    "_MPI_Comm_accept", referenced from: 
     MPI::Intracomm::Accept(char const*, MPI::Info const&, int) const in main.o 
    "_MPI_Comm_connect", referenced from: 
     MPI::Intracomm::Connect(char const*, MPI::Info const&, int) const in main.o 
    "_MPI_Comm_disconnect", referenced from: 
     MPI::Comm::Disconnect() in main.o 
    "_MPI_Comm_get_errhandler", referenced from: 
     MPI::Comm::Get_errhandler() const in main.o 
    "_MPI_Comm_set_errhandler", referenced from: 
     MPI::Comm::Set_errhandler(MPI::Errhandler const&) const in main.o 
    "_MPI_Comm_spawn", referenced from: 
     MPI::Intracomm::Spawn(char const*, char const**, int, MPI::Info const&, int) const in main.o 
     MPI::Intracomm::Spawn(char const*, char const**, int, MPI::Info const&, int, int*) const in main.o 
    "_MPI_Comm_spawn_multiple", referenced from: 
     MPI::Intracomm::Spawn_multiple(int, char const**, char const***, int const*, MPI::Info const*, int) in main.o 
     MPI::Intracomm::Spawn_multiple(int, char const**, char const***, int const*, MPI::Info const*, int, int*) in main.o 
    "_MPI_Grequest_complete", referenced from: 
     MPI::Grequest::Complete() in main.o 
    "_MPI_Op_commutative", referenced from: 
     MPI::Op::Is_commutative() const in main.o 
    "_MPI_Reduce_local", referenced from: 
     MPI::Op::Reduce_local(void const*, void*, int, MPI::Datatype const&) const in main.o 
    "_MPI_Win_call_errhandler", referenced from: 
     MPI::Win::Call_errhandler(int) const in main.o 
    "_MPI_Win_get_errhandler", referenced from: 
     MPI::Win::Get_errhandler() const in main.o 
    "_MPI_Win_set_errhandler", referenced from: 
     MPI::Win::Set_errhandler(MPI::Errhandler const&) const in main.o 
    "_ompi_mpi_comm_null", referenced from: 
     MPI::Intracomm::Intracomm(ompi_communicator_t*) in main.o 
     MPI::Graphcomm::Graphcomm(ompi_communicator_t* const&) in main.o 
     MPI::Cartcomm::Cartcomm(ompi_communicator_t* const&) in main.o 
    "_ompi_mpi_comm_world", referenced from: 
     _main in main.o 
    "_ompi_mpi_double", referenced from: 
     _main in main.o 
    "_ompi_mpi_op_sum", referenced from: 
     _main in main.o 
    "_ompi_op_set_cxx_callback", referenced from: 
     MPI::Op::Init(void (*)(void const*, void*, int, MPI::Datatype const&), bool) in main.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

我缺少在上面安裝過程什麼?

+0

檢查打開MPI被編譯爲64位(x86_64的)或作爲脂肪64位和32位而不是32位(I386)僅(例如運行'在Terminal.app文件/路徑/到/ libmpi.dylib')。如果它只是32位,請重新編譯它或將項目目標切換到i386。 –

+0

如果您在使用Xcode – pyCthon

回答

5

我有同樣的問題,當我從源代碼編譯openmpi時,添加了頭文件和庫搜索路徑,但忘記將庫作爲鏈接器標記添加到構建設置中。添加他們解決了這個您可以鍵入mpicc –showme以查看mpi運行所需的庫。

+0

時遇到問題,macports始終是一個不錯的選擇您能否顯示此列表?我只是不能男性showme工作 –

+0

對我來說它返回以下內容:'gcc -I/usr/local/include -L/usr/local/lib -lmpi -lm' –

0

或者只是鍵入mpiC++而不是mpicc。這對我有用;)

10

首先一定要安裝MPI。 我個人使用brew這樣做。

brew update 
brew install open-mpi 

然後檢查C++的要求:

mpic++ -showme 

mpicc -showme for c

我與MPIC++輸出是:

clang++ -I/usr/local/Cellar/open-mpi/1.8.6/include -L/usr/local/opt/libevent/lib -L/usr/local/Cellar/open-mpi/1.8.6/lib -lmpi_cxx -lmpi 

然後,我們得到了包括路徑,庫路徑和其他一些標誌。從前面的命令,我們得到了我們需要添加的輸出:

  1. 「/usr/local/Cellar/open-mpi/1.8.6/include」在「搜索路徑 - 標題搜索路徑」
  2. 「在/ usr /本地的/ opt/libevent的/ lib目錄」 和 「/usr/local/Cellar/open-mpi/1.8.6/lib」 在「搜索路徑 - 庫搜索路徑」
  3. 「-lmpi_cxx -lmpi」中的「鏈接 - 其他鏈接器標記」

這些可以通過Xcode項目中的Build Settings選項完成。

因爲MPI需要使用它自己的程序來運行我們我們需要改變可執行

  1. 選擇「編輯計劃」enter image description here
  2. 在對話框中下信息可執行選擇從ComboBox 其他...enter image description here
  3. 將其更改爲mpiexec這是「orterun」的別名。對我來說,它在/usr/local/Cellar/open-mpi/1.8.6/bin。請注意,這通常是一個隱藏文件夾。您可以按cmd + shift + g打開它。
  4. 對於運行mpiexec的需要知道作爲參數處理器的數量和可執行文件。所以,下參數

    • 同一對話框中添加「-n X」其中X是「我會用2在這個例子中」要使用處理器的數量。
    • add 「$ BUILT_PRODUCTS_DIR/$ EXECUTABLE_PATH」這是指定可執行文件的環境變量的組合。

enter image description here

  • 然後加入<mpi.h>頭到你的源代碼。
  • 運行它,你會看到2 「你好,世界!」(因爲我使用-n 2爲例)。

來源:open-mpi xcode FAQDebugging & running MPI programs in Xcode

+0

非常有用,謝謝! – Nisba

+0

不客氣。 – XOR

+0

偉大的教程!應該是最佳答案 –