xerces-c 2,8: erro ao carregar bibliotecas compartilhadas
Pergunta
Estou tentando compilar um programa executado em um servidor HP UX em um Red Hat Linux.
Ele usa biblioteca xerces-c para analisar arquivos XML. Compilação é ok, mas quando eu tentar executá-lo, eu recebo a seguinte mensagem
./ a.out: erro ao carregar compartilhada Bibliotecas: libxerces-c.so.28: não pode abrir arquivo objeto compartilhado: Nenhum tal lima ou diretório
Eu escrevi um programa muito simples para tentar entender o que está acontecendo:
#include <xercesc/util/PlatformUtils.hpp>
#include <xercesc/util/TransService.hpp>
#include <xercesc/parsers/SAXParser.hpp>
#include <xercesc/util/OutOfMemoryException.hpp>
int main(int argc, char* argv[])
{
return 0;
}
E compilado-lo assim:
g ++ test.cpp -L./xml/xerces-c_2_8_0/lib -lxerces-c -I./xml/xerces-c_2_8_0/include
Surpreendentemente o arquivo está realmente lá:
lib]$ ls
libxerces-c.a libxerces-c.so.28 libxerces-depdom.a libxerces-depdom.so.28
libxerces-c.so libxerces-c.so.28.0 libxerces-depdom.so libxerces-depdom.so.28.0
Todos os pensamentos? Eu sinto que estou faltando alguma coisa, mas não sei o quê.
Agradecemos antecipadamente.
Solução
ldd a.out
correr e ver se o vinculador pode resolver o direito .so arquivo
LD_LIBRARY_PATH
exportação para incluir a pasta atual (da mesma forma como a variável PATH) e verificar ldd novamente
Outras dicas
a boa maneira de fazer o que você quer é o seguinte:
g++ test.cpp -Xlinker -R ./xml/xerces-c_2_8_0/lib -lxerces-c -I./xml/xerces-c_2_8_0/include
ou
g++ test.cpp -Wl,-rpath ./xml/xerces-c_2_8_0/lib -lxerces-c -I./xml/xerces-c_2_8_0/include
opções Xlinker ou Wl permitem que você use específica opções de ligação, você não precisa modifiy LD_LIBRARY_PATH
Você precisa dizer a biblioteca c runtime onde encontrar os vários símbolos que Arent compilados estaticamente no seu código e Arent nos locais normalmete / lib e / usr / lib.
Você pode fazer isso adicionando o caminho para a biblioteca compartilhada para LD_LIBRARY_PATH. Neste caso, este será o que você tem posto para o argumento -L para o compilador.