64-битная ошибка драйвера PSQL

У меня есть 64-битный сервер Ubuntu 12.04 под Hyper-V. Я установил 64-разрядные драйверы Pervasive SQL, чтобы можно было запускать ежедневный скрипт обновления (обновляет внешнюю базу данных MySQL с другого локального сервера, на котором работает программное обеспечение Exchequer / база данных PSQL).

Эти драйверы, кажется, конфликтуют, как я выяснил, когда пытался выполнить любые команды apt-get:

apt-get update
apt-get: /usr/local/psql/lib64/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by apt-get)
apt-get: /usr/local/psql/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by apt-get)
apt-get: /usr/local/psql/lib64/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by apt-get)
apt-get: /usr/local/psql/lib64/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by /usr/lib/x86_64-linux-gnu/libapt-pkg.so.4.12)
apt-get: /usr/local/psql/lib64/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by /usr/lib/x86_64-linux-gnu/libapt-pkg.so.4.12)
apt-get: /usr/local/psql/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by /usr/lib/x86_64-linux-gnu/libapt-pkg.so.4.12)

Любая помощь будет отличной.

2 ответа

Решение

Похоже, вы или установщик добавили /usr/local/pgsql/lib64/ в /etc/ld.so.conf или к LD_LIBRARY_PATH переменная окружения. Если это в ld.so.conf удалить его и запустить ldconfig, То же самое, если это по умолчанию LD_LIBRARY_PATH - проверять /etc/environmentобщесистемные сценарии запуска, ваш .bashrc а также .bash_profile и т.д., чтобы увидеть, где он мог быть добавлен.

Страшная идея иметь несовместимое libstdc++ на пути поиска библиотеки. Если установщик Pervasive сделал это, сообщите об ошибке, это совершенно неприемлемо и (как вы обнаружили) может сломать вашу систему.

Как только он исчезнет из вашего пути поиска в библиотеке, все остальное возобновит работу, но драйверы не будут работать. Вы могли бы заставить их работать, запустив программу, которая использует их со скриптом-оберткой, который устанавливает LD_LIBRARY_PATH="/usr/local/pgsql/lib64/:${LD_LIBRARY_PATH}" но только если сами эти программы не требуют других libstdc++,


Скрипт-обёртка может быть простым:

#!/bin/sh
set -e
LD_LIBRARY_PATH="/usr/local/pgsql/lib64/:${LD_LIBRARY_PATH}"
/path/to/my/program "$@"

"$@" является "магической" переменной, которая раскрывается в исходные аргументы, передаваемые сценарию оболочки. Сохраните сценарий как, скажем, myprogram_wrapper.sh, редактировать /path/to/my/program указать местоположение исполняемого файла приложения, которое вы хотите запустить, и использовать chmod a+x my_program_wrapper.sh сделать его исполняемым. Затем вы можете запустить приложение с ./my_program_wrapper.sh или добавьте эту оболочку к ярлыкам на рабочем столе и т. д. вместо исходного приложения.

Именно так много программного обеспечения, поставляемого в виде двоичных файлов, например Adobe Reader, запускается самостоятельно со своими связанными библиотеками, не затрагивая остальную часть системы. Это не лучший способ (это использовать rpath связываю) но все нормально.

Кто-то на форумах Pervasive предложил это исправить:

Из-за конфликтов версий мне нужно было переместить некоторые файлы, чтобы можно было запускать "apt-get", не жалуясь на версии.

sudo mv /usr/local/psql/lib/libgcc_s.so.1 /usr/local/psql/lib/libgcc_s.so.1.org

sudo mv /usr/local/psql/lib/libstdc++.so.6 /usr/local/psql/lib/libstdc++.so.6.org

и после этого не запускается "sudo ldconfig"

Это работает, но после прочтения ответа @CraigRinger, я думаю, что это похоже на взлом. К сожалению, я не знаю достаточно, чтобы иметь возможность реализовать LD_LIBRARY_PATH исправить.

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