Erro de driver de 64 bits do PSQL

3

Eu tenho uma configuração do servidor Ubuntu 12.04 de 64 bits em Hyper-V. Instalei drivers SQL Pervasive de 64 bits para que um script de atualização de estoque possa ser executado diariamente (banco de dados MySQL de atualizações externas de outro servidor local que executa o software Exchequer / banco de dados PSQL).

Esses drivers parecem entrar em conflito, como descobri ao tentar executar qualquer comando do 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)

Qualquer ajuda seria ótima.

    
por Alex Holsgrove 22.11.2012 / 13:36

2 respostas

3

Parece que você ou o instalador adicionaram /usr/local/pgsql/lib64/ a /etc/ld.so.conf ou à variável de ambiente LD_LIBRARY_PATH . Se estiver em ld.so.conf , remova-o e execute ldconfig . Ditto se estiver no padrão LD_LIBRARY_PATH - verifique /etc/environment , os scripts de inicialização de todo o sistema, seu .bashrc e .bash_profile etc para ver onde ele pode ter sido adicionado.

É uma péssima ideia ter um libstdc++ incompatível no caminho de pesquisa da biblioteca. Se o instalador da Pervasive fez isso, relate um bug, é totalmente inaceitável e (como você descobriu) pode quebrar seu sistema.

Quando não estiver mais no caminho de pesquisa da sua biblioteca, tudo o mais voltará a funcionar, mas os drivers não funcionarão. Você pode fazer com que funcionem executando o programa que os utiliza com um script de wrapper que define LD_LIBRARY_PATH="/usr/local/pgsql/lib64/:${LD_LIBRARY_PATH}" , mas apenas se esses programas não exigirem o outro libstdc++ .

Um script de wrapper pode ser tão simples quanto:

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

"$@" é uma variável "mágica" que se expande nos argumentos originais passados para o script de shell. Salve o script como, por exemplo, myprogram_wrapper.sh , edite /path/to/my/program para apontar para o local do executável do aplicativo que você deseja iniciar e use chmod a+x my_program_wrapper.sh para torná-lo executável. Você pode iniciar o aplicativo com ./my_program_wrapper.sh ou adicionar esse wrapper a atalhos da área de trabalho, etc. no lugar do aplicativo original.

É assim que muitos softwares incluídos como binários, como o Adobe Reader, se lançam em bibliotecas integradas sem afetar o resto do sistema. Não é a melhor maneira (isso é usar rpath link), mas está tudo bem.

    
por 23.11.2012 / 00:55
2

Alguém nos fóruns da Pervasive sugeriu essa correção:

Due to some versions conflicts I needed to move some files to be able to run "apt-get" without complaining about versions.

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

and after that not run "sudo ldconfig"

Isso funciona, mas depois de ler a resposta do @ CraigRinger, acho que parece um pouco hackeado. Infelizmente eu não sei o suficiente para poder implementar a correção LD_LIBRARY_PATH .

    
por 23.11.2012 / 11:15