Causa raiz do problema
O erro está ocorrendo porque, em tempo de compilação, ele está pesquisando corretamente o caminho /usr/local/lib
antes de pesquisar o caminho padrão do sistema, assim, no momento do link, todos os símbolos são resolvidos. No entanto, em tempo de execução, o caminho /usr/local/lib
não é pesquisado antes do /lib/i386-linux-gnu
preexistente, de forma que ele encontre a biblioteca com nome idêntico no último diretório antes da biblioteca desejada em /usr/local/lib
.
Solução, versão fácil: caminho de pesquisa da biblioteca global (com ressalva)
A versão fácil é inserir /usr/local/lib
na variável de ambiente LD_LIBRARY_PATH
ou /etc/ld.so.conf
config e executar ldconfig
. Para a solução "rápida", você quer /usr/local/lib
antes de mais nada.
No entanto, esse é o azarado, você não quer forçar todos os seus programas a pesquisar /usr/local/lib
antes do caminho da biblioteca do sistema (por exemplo: /lib/i386-linux-gnu
) - isso faz com que É altamente provável que você cause um conflito de versões com uma biblioteca do sistema usada por outro programa fornecido pelo seu sistema ou pelo gerenciador de pacotes e faça com que o programa do sistema falhe. Isso significa "fazer as coisas corretamente", você não deseja usar LD_LIBRARY_PATH
, LD_PRELOAD
ou /etc/ld.so.conf
para forçar seu caminho de pesquisa. ( Na verdade, LD_PRELOAD
deve ser evitado fora do trabalho de desenvolvimento )
Solução, versão estável: atualizar o ELF RPATH
Em vez disso, ao compilar suas próprias versões de aplicativos, você pode usar a variável de ambiente LD_RUN_PATH
(gnu ld & gold) ou definir LDFLAGS
to -Wl,-rpath /usr/local/lib
para gerenciar o caminho interno de pesquisa da biblioteca de seus binários (incluindo dependências de bibliotecas compartilhadas .so)
Por exemplo, você pode executar o seguinte para configurar sua biblioteca:
export LD_RUN_PATH=/usr/local/lib
./configure --prefix=/usr/local <--yourflags>
make install
Minha experiência com essa técnica está no HP-UX, onde o utilitário chatr
mostrará o rpath incorporado (e o sinalizador de link é +b
em vez de -rpath). readelf
ou objdump
provavelmente mostrará o rpath no linux.
patchelf afirma ser capaz de atualizar o rpath em binários existentes no linux x86, mas eu mesmo não testei.