"не могу найти -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 можно без проблем снять.