Я пытаюсь запустить некоторые программы MPI в xcode 4. Я установил openmpi из MacPort, набрав sudo port install openmpi
и установка закончилась нормально. Затем я добавил opt / local / include / openmpi в мои пути поиска по заголовку пользователя и перетащил «libmpi.dylib» и «libmpi_cxx.dylib» в мой проект.
Но затем, когда я попытался запустить программу, я получил следующее сообщение об ошибке:
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)
Я что-то упускаю в описанных выше процессах установки?
У меня была такая же проблема, когда я компилировал openmpi из исходных кодов, добавил пути поиска по заголовкам и библиотекам, но забыл добавить библиотеки в качестве флагов компоновщика в настройки сборки. Добавление их решило это. Вы можете напечатать mpicc –showme
чтобы увидеть библиотеки, необходимые для запуска mpi.
Сначала обязательно установите MPI.
Я лично пользуюсь заваривать сделать это.
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
Затем мы получили путь включения, путь к библиотеке и некоторые другие флаги. Из вывода предыдущей команды мы получили, что нам нужно добавить:
Это можно сделать через Настройки сборки вариант из проекта Xcode.
Так как МПИ нужно использовать свою собственную программу для бежать наши мы должны изменить исполнимый.
cmd + shift + g
,Для бега Mpiexec нужно знать как аргументы количество процессоров и запускаемый файл. Итак, в том же диалоговом окне под аргументы
<mpi.h>
заголовок к вашему исходному коду.источники: FAQ по open-mpi xcode, отладка & запуск программ MPI в Xcode
Или просто введите mpic ++ вместо mpicc. Это сработало для меня;)