Distribuindo binário com dependências no Linux

2

Estou desenvolvendo um aplicativo multi-plataforma e estou tendo problemas com a distribuição de um binário do Linux. No Windows, as dll foram -libsndfile-1.dll lua5.1.dll lua51.dll openal32.dll sfml-audio.dll sfml-graphics.dll sfml-network.dll sfml-system.dll sfml-window.dll

Este é um pré-lançamento muito cedo, então eu não quero escrever um pacote. Estou interessado apenas em fazer com que o usuário faça o download de um tarball e execute o binário dentro dele. Quais são as maneiras típicas para os usuários obterem essas dependências no Linux, sem escrever um pacote?

PS Também tenho Linux 64-bit, e um usuário relatou que o aplicativo não foi executado em seu Linux de 32 bits. Qual poderia ser o problema? Eu não tive esse problema com o Windows (construído em um sistema de 64 bits, funciona em 32 bits).

pessoa
fonte
1
Isso deve ir para o SO.
Shiki

Respostas:

2

Não tenho certeza se isso é exatamente o que você está procurando, mas normalmente o que é feito para os programas Linux é que você lista as dependências na página da web onde você oferece o produto para download. No seu caso, algo como

Você precisará ter o seguinte instalado:

(Obviamente, especifique os números de versão também, se o seu programa só funciona com certas versões). Então, um usuário Linux checaria seu gerenciador de pacotes para ter certeza de que eles tinham todos aqueles antes de tentar instalar o seu programa.

Alguns programas são distribuídos da maneira que Ignacio explicou, ou seja, incluem todas as dependências que você precisa dentro do arquivo que você distribui. Isso tende a incomodar algumas pessoas, porque elas estão presas a cópias extras das bibliotecas que não podem ser atualizadas e podem até entrar em conflito com as versões do sistema.

David Z
fonte
2

Você pode vincular estaticamente o programa a todas as bibliotecas, exceto libc e libm. (Heck, você pode até mesmo ligar neles).

zvrba
fonte
1

O equivalente no Linux é incluir os arquivos .so em um diretório dentro do pacote e ter um shell script definido $LD_LIBRARY_PATHpara apontar para esse diretório e, em seguida, executar o executável binário.

O problema com 32 x 64 é que o compilador gera código de 64 bits e vincula-se a bibliotecas de 64 bits. Você precisará instalar um conjunto de ferramentas de 32 bits para criar um binário de 32 bits. Você pode executar fileos vários binários para confirmar isso.

Ignacio Vazquez-Abrams
fonte
1

Você pode obter as dependências de um binário usando o comando ldd

Por exemplo :

ldd program_binary

        libctest.so.1 => /opt/lib/libctest.so.1 (0x00002aaaaaaac000)
        libc.so.6 => /lib64/tls/libc.so.6 (0x0000003aa4e00000)
        /lib64/ld-linux-x86-64.so.2 (0x0000003aa4c00000)

Mas é melhor compartilhar como fonte, pois as libs podem ser de versões diferentes com símbolos diferentes ou de arquitetura diferente.

nahar
fonte