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
исправить.