"не могу найти -lmpi*" при компиляции кода openmpi

Я пытался установить openmpi 1.8.1 из исходного кода на сервере Unbuntu 14.04. Я хотел бы использовать mpi для крупномасштабного расчета на одной машине с несколькими ядрами.

Простой тест "Hello world" можно запустить без проблем.

Однако, когда я пытаюсь скомпилировать программу, которую мне нужно использовать. Я получил следующую ошибку:

/usr/bin/ld: cannot find -lmpi_usempi 
/usr/bin/ld: cannot find -lmpi_mpifh 
/usr/bin/ld: cannot find -lmpi
collect2: error: ld returned 1 exit status
make: *** [mcp2_mpi] Error 1

Я пытался установить LD_LIBRAY_PATH в каталог, где можно найти lib openmpi. Кажется, не работает. Я попытался проверить команду ld в подробном режиме.

$ ld -lmpi_usempi --verbose
attempt to open /usr/x86_64-linux-gnu/lib64/libmpi_usempi.so failed
attempt to open /usr/x86_64-linux-gnu/lib64/libmpi_usempi.a failed
attempt to open //usr/local/lib/x86_64-linux-gnu/libmpi_usempi.so failed
attempt to open //usr/local/lib/x86_64-linux-gnu/libmpi_usempi.a failed
attempt to open //usr/local/lib64/libmpi_usempi.so failed
attempt to open //usr/local/lib64/libmpi_usempi.a failed
attempt to open //lib/x86_64-linux-gnu/libmpi_usempi.so failed
attempt to open //lib/x86_64-linux-gnu/libmpi_usempi.a failed
attempt to open //lib64/libmpi_usempi.so failed
attempt to open //lib64/libmpi_usempi.a failed
attempt to open //usr/lib/x86_64-linux-gnu/libmpi_usempi.so failed
attempt to open //usr/lib/x86_64-linux-gnu/libmpi_usempi.a failed
attempt to open //usr/lib64/libmpi_usempi.so failed
attempt to open //usr/lib64/libmpi_usempi.a failed
attempt to open //usr/local/lib/libmpi_usempi.so failed
attempt to open //usr/local/lib/libmpi_usempi.a failed
attempt to open //lib/libmpi_usempi.so failed
attempt to open //lib/libmpi_usempi.a failed
attempt to open //usr/lib/libmpi_usempi.so failed
attempt to open //usr/lib/libmpi_usempi.a failed
ld: cannot find -lmpi_usempi

Кажется, ld не ищет библиотеки в LD_LIBRARY_PATH. Я попытался создать файл в /etc/ld.so.conf.d/, чтобы включить путь к openmpi lib. Затем команда sudo ldconfig -v. Я нахожу следующий вывод:

    /usr/local/openmpi/lib:
    libopen-rte.so.7 -> libopen-rte.so.7.0.3
    libmpi_mpifh.so.2 -> libmpi_mpifh.so.2.3.0
    libopen-trace-format.so.1 -> libopen-trace-format.so.1.0.0
    libmpi_cxx.so.1 -> libmpi_cxx.so.1.1.3
    liboshmem.so.1 -> liboshmem.so.1.0.0
    libvt-mpi.so.0 -> libvt-mpi.so.0.0.0
    libvt-hyb.so.0 -> libvt-hyb.so.0.0.0
    libvt-mt.so.0 -> libvt-mt.so.0.0.0
    libotfaux.so.0 -> libotfaux.so.0.0.0
    libvt-mpi-unify.so.0 -> libvt-mpi-unify.so.0.0.0
    libopen-pal.so.6 -> libopen-pal.so.6.1.1
    libmpi_usempi.so.1 -> libmpi_usempi.so.1.3.0
    libmpi.so.1 -> libmpi.so.1.5.0
    libvt.so.0 -> libvt.so.0.0.0
    libmca_common_sm.so.4 -> libmca_common_sm.so.4.0.3
    libompitrace.so.0 -> libompitrace.so.0.0.0

Похоже, что Libs включены в путь поиска ld.

Однако у меня все та же проблема, что и раньше.

/usr/bin/ld: cannot find -lmpi_usempi
/usr/bin/ld: cannot find -lmpi_mpifh
/usr/bin/ld: cannot find -lmpi
collect2: error: ld returned 1 exit status
make: *** [mcp2_mpi] Error 1

Есть ли предложения по этому вопросу? Большое спасибо.

4 ответа

Рабочая установка Ubuntu 20.04

В общем, надо сдавать pkg-config флаги для команды компиляции, чтобы иметь возможность компилировать, например:

       sudo apt install libopenmpi-dev
gcc $(pkg-config --cflags mpi) main.c $(pkg-config --libs mpi)

sudo apt install libmpich-dev
gcc $(pkg-config --cflags mpich) main.c $(pkg-config --libs mpich)

в зависимости от того, хотите ли вы openmpi или MPICH: https://stackoverflow.com/questions/2427399/mpich-vs-openmpi

Теоретически оба они компилируют простой тест вроде этого:

       #include <mpi.h>

int main() {
  MPI_Finalize();
  return 0;
}

Однако в Ubuntu 20.04 работает только MPICH, потому что libopenmpi-dev пакет имеет ошибку и забыл символическую ссылку:

       /usr/lib/x86_64-linux-gnu/libmpi.so.40 -> /usr/lib/x86_64-linux-gnu/libmpi.so

Вы можете просто сделать это вручную в качестве временного решения. Отчет об ошибке: https://bugs.launchpad.net/ubuntu/+source/openmpi/+bug/1869612

Я нашел это, ища libmpi.so с:

       locate libmpi.so
dpkg -L libopenmpi-dev

Но это сработает, если я просто передам это напрямую команде компиляции:

       gcc $(pkg-config --cflags mpi) main.c /usr/lib/x86_64-linux-gnu/libmpi.so.40

Я также теперь узнал о существовании /usr/bin/mpicc пакет из openmpi-binпакет https://stackoverflow.com/questions/20739909/what-is-mpic-file-used-for, но libopenmpi-dev версия кажется сломанной на Ubuntu также из-за отсутствия libmpi.so символическая ссылка.

Решено: "не могу найти -lmpi*" при компиляции кода openmpi

Решения: я пытаюсь проверить другие параметры в моей командной строке компиляции. Я добавляю экстрастатик в командную строку компиляции. Удалив это, он наконец работает для меня.

Шаги, которые вы пробовали, влияют на путь поиска библиотеки времени выполнения. Предполагая, что вы используете gcc, чтобы задать путь поиска по времени компиляции, вам нужно использовать компилятор -L флаг

   -Ldir
       Add directory dir to the list of directories to be searched for -l.

Так, например, если вы установили библиотеки в /usr/local/openmpi/lib, измените ваш gcc командная строка

-L /usr/local/openmpi/lib -lmpi_usempi -lmpi_mpifh -lmpi

Согласно документации OpenMPI , рекомендуется не собирать MPI статически. Ответ Уилфа смутил меня, потому что одна из моих библиотек (CUDD, если кому интересно) обычно требовала-staticфлаг построить. Если я просто удалю флаг, сборка завершится ошибкой.

Изучая документацию MPICH и gcc, я обнаружил, чтоmpicxx -staticиgcc -staticэто не одна и та же идея. К счастью, CUDD можно создать как разделяемую библиотеку. Я настроил и собрал общую библиотеку, после чего флаг -static можно без проблем снять.

Другие вопросы по тегам