Movendo programas compilados em uma máquina para outra máquina e evitando problemas de dependências de bibliotecas

4

Quando eu compilo um programa com .dll dependencies no Windows, basta copiar os ddls com o programa desejado para outro pc e colocar as DLLs dentro do diretório do programa.

Agora aqui está o meu problema: Eu compilei um programa com o Ubuntu usando o clang e o clang ++, quando eu transferi meu programa compilado para o meu servidor (CentOS), o programa não carrega devido à falta de bibliotecas. Eu pensei em transferir minhas bibliotecas do meu pc para o servidor, mas não sei se é possível.

Não consigo instalar programas nesse servidor porque não tenho senha de root, então existe uma maneira de resolver esse problema?

    
por Chester96 26.10.2014 / 12:42

1 resposta

3

Copiar arbitrariamente arquivos .so para diretórios do sistema não é uma boa prática, pois copiará as bibliotecas compartilhadas para o sistema de destino sem o reconhecimento do Pacote de Controle do Sistema, portanto, pode causar conflitos com o software instalado e pode não ter outras dependências não é possível mapear manualmente.

Sua milhagem pode variar, mas existem três abordagens diferentes que você pode procurar:

O primeiro é tentar instalar os pacotes de software necessários que contêm as versões compatíveis das bibliotecas na distro de destino. Isso requer raiz, porém, que você indicou como não sendo uma opção. Em qualquer caso, se isso se tornar uma opção em algum momento, aqui estão algumas dicas para ajudar nessa abordagem: ldd you_executable_file mostra as dependências da biblioteca de um programa específico. Você pode procurar por pacotes na distro que forneçam tais bibliotecas (no Fedora, por exemplo, você pode usar yum provides path_to_required_file para lhe dizer quais pacotes precisam ser instalados.

O segundo está tentando produzir um executável agnóstico de distribuição. Para tal, você deve usar bibliotecas estáticas ao compilar seu software. Geralmente, você pode encontrar versões compartilhadas (.so) e estáticas (.a) da maioria das bibliotecas no Linux. Você deve usar as versões estáticas e vinculá-las como se fossem arquivos de objetos (.o). O lado negativo é que o binário gerado será muito maior do que ao usar bibliotecas compartilhadas porque ele carregará todo o código da biblioteca em si. Além disso, não será sensível a correções de bugs nas bibliotecas instaladas posteriormente no sistema (isso exigirá a recompilação de seu programa com a nova versão corrigida).

A terceira opção é realmente copiar as bibliotecas para o novo sistema (mesmo não sendo raiz) em um diretório sob seu diretório home e usar as variáveis de ambiente LD_LIBRARY_PATH e / ou LD_PRELOAD para forçar o vinculador dinâmico a usar seu cópias das bibliotecas. Observe que você pode precisar copiar muitas bibliotecas (que você descobrirá usando o comando ldd que mencionei acima). LD_LIBRARY_PATH diz ao vinculador dinâmico para procurar caminhos adicionais para encontrar bibliotecas ausentes. LD_PRELOAD força o vinculador dinâmico a pré-carregar uma versão específica de uma biblioteca sobrepondo a versão de todo o sistema.

    
por 26.10.2014 / 13:21