Не удалось скомпилировать используя mpich и gcc
Я собрал mpich 3.2 с gcc 4.8.3 на centos. Кажется, все в порядке. Затем я написал простую тестовую программу,
#include "mpi.h"
int main(int argc,char **argv)
{}
и использовать mpiC++ для компиляции. Тогда ошибки возвращаются,
/home/setups/mpich-3.2/build/lib/libmpi.so: неопределенная ссылка на _intel_fast_memcpy'
/home/setups/mpich-3.2/build/lib/libmpi.so: undefined reference to
__intel_sse2_strncmp'
/home/setups/mpich-3.2/build/lib/libmpi.so: неопределенная ссылка на _intel_fast_memset'
/home/setups/mpich-3.2/build/lib/libmpi.so: undefined reference to
__intel_sse2_strlen"
Что именно идет не так? Я так запутался, что ошибка, похоже, связана с компиляторами Intel, но я использую gcc для компиляции mpich командой,
./configure --prefix=/home/setups/mpich-3.2/build/ CC=gcc CXX=gcc F77=gfortran FC=gfortran
Я добавил /home/setups/mpich-3.2/build/bin в PATH и /home/setups/mpich-3.2/build/lib в LD_LIBRARY_PATH
mpicc -v показывает :
mpicc for MPICH version 3.2
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/home/setups/gcc-4.8.3/build/libexec/gcc/x86_64-unknown-linux-gnu/4.8.3/lto-wrapper
Target: x86_64-unknown-linux-gnu
Configured with: ./configure --prefix=/home/setups/gcc-4.8.3/build --with-gmp=/home/setups/gmp-6.1.2/build --with-mpfr=/home/setups/mpfr-3.1.5/build --with-mpc=/home/setups/mpc-1.0.3/build --disable-multilib
Thread model: posix
gcc version 4.8.3 (GCC)
2 ответа
/home/setups/mpich-3.2/build/lib/libmpi.so: неопределенная ссылка на _intel_fast_memcpy'
Это настоятельно предполагает, что компилятор Intel использовался для сборки mpich.
Что может случиться gcc/g++/gfortran
не в вашем PATH
или если ваша среда указывает на компилятор Intel (например, CC=icc
или же CXX=icpc
или же FC=ifort
).
Вы можете найти свое решение на сайте open-mpi.org и в разделе часто задаваемых вопросов по созданию MPI. Например, пункт 17.
Распространенной ошибкой при создании Open MPI с помощью набора компиляторов Intel является случайное указание компилятора Intel C в качестве компилятора C++. В частности, последние версии компилятора Intel переименовали компилятор C++ в "icpc" (раньше это был "icc", то же самое, что и компилятор C). Пользователи, привыкшие к старому имени, склонны указывать "icc" в качестве компилятора C++, что приведет к сбою в конце процесса сборки Open MPI, поскольку код C++ будет скомпилирован с помощью компилятора C. Плохие вещи тогда случаются. Решение заключается в том, чтобы указать, что компилятором C++ является "icpc", а не "icc". Например: