Я пытаюсь написать базовый клиент для интеграции Postgres на C с использованием libpq, я скомпилировал библиотеки после установки только для клиента на этой странице и пока все хорошо, я компилирую свою программу со следующим:
cc -o connect connect.c -I/usr/local/pgsql/include -L/usr/local/pgsql/lib -lpq
и при запуске программы это результат:
./connect: error while loading shared libraries: libpq.so.5: cannot open shared object file: No such file or directory
Я правильно скомпилировал все библиотеки и в системе есть libpq.so.5:
plocate libpq.so.5
вернуть /usr/local/pgsql/lib/libpq.so.5
Может ли кто-нибудь помочь мне с этим? Что мне не хватает? заранее спасибо
что показывает $LD_LIBRARY_PATH? если /usr/local/pgsql/lib на нем нет ....
В какой операционной системе вы его используете? В Linux вам необходимо настроить привязки среды выполнения динамического компоновщика, перечислив каталоги пользовательских библиотек в /etc/ld.so.conf
или /etc/ld.so.conf.d/*.conf
, а затем запустить sudo ldconfig
, который обновит файл /etc/ld.so.cache
. (См. справочную страницу ldconfig
.)
Тот факт, что ваша libpgsql установлена в /usr/local, предполагает, что вы, возможно, собрали ее из исходного кода самостоятельно. В большинстве случаев это должно быть крайней мерой. Велика вероятность, что компоненты libpgsql как для разработки, так и для среды выполнения доступны предварительно упакованными для вашей ОС, и такие пакеты обычно являются лучшим выбором: кто-то другой выяснит все нюансы сборки и установки, с которыми в противном случае пришлось бы иметь дело вам. сам. Например, настройка динамического компоновщика.
Я использую Arch Linux, но пытаюсь собрать его для исходного кода, поскольку этот вариант будет развернут в других дистрибутивах Linux (Debian, Centos и другие), и требованием является сохранение как можно меньшего размера. Я пытаюсь настроить /etc/ld.so.conf, добавив include /usr/local/pgsql/lib/
и запустив sudo ldconfig
, но результат не меняется.
У вас библиотека установлена по нестандартному пути. Вам нужно указать компоновщику, где его найти, установив LD_LIBRARY_PATH
:
$ export LD_LIBRARY_PATH=/usr/local/pgsql/lib
$ ./client
Если вы используете bash, вы можете использовать эту конструкцию для добавления значения:
$ export LD_LIBRARY_PATH = "${LD_LIBRARY_PATH}${LD_LIBRARY_PATH:+:}/usr/local/pgsql/lib"
сначала проверьте, установлен ли LD_LIBRARY_PATH, если он не пуст, добавьте к нему /usr/local/pgsql/lib.
@ticktalk Я добавил это к вышесказанному, но для меня это выходит за рамки вопроса. Должен ли я также проверить, что путь уже отсутствует?
Я думаю, что ваше дополнение именно то, что требуется. он сохраняет любое существующее определение и добавляет путь, необходимый для поиска «отсутствующей» общей библиотеки.
Я думаю, может ли это быть связано с порядком аргументов в команде компиляции, но тогда ошибка возникла бы во время компиляции, а не во время выполнения. Может быть, просто попробуйте запустить
ldd connect
и посмотрите, что получится.