Executável compilado

Executável compilado

Se, por exemplo, eu compilei um programa C simples que usa GTK 3 em uma máquina rodando Ubuntu, poderei executá-lo em outras versões do Linux?

Nota: Minhas perguntas reais são "Devo rotular meu programa compilado para Linux ou apenas Ubuntu?"

por exemplo. Devo rotular minha página de downloads como

Windows
    program.exe

Linux
    program

Macintosh
    program.app

ou

Windows
    program.exe

Ubuntu < Version 17.04
    program

Macintosh
    program.app

Responder1

Os executáveis ​​do Linux não são específicos de uma distribuição Linux. Mas eles são específicos de uma arquitetura de processador e de um conjunto de versões de biblioteca.

Um executável paraqualquersistema operacional é específico para uma arquitetura de processador. Os usuários de Windows e Mac não se importam tanto porque esses sistemas operacionais rodam mais ou menos em uma única arquitetura. (O OSX costumava ser executado em várias arquiteturas de processador, e os aplicativos OSX eram normalmente distribuídos como um pacote que continha código para todas as arquiteturas de processador suportadas, mas o OSX moderno só funciona em processadores AMD64. O Windows é executado em processadores Intel de 32 e 64 bits. , então você pode encontrar executáveis ​​do Windows de “32 bits” e “64 bits”.)

O Windows resolve o problema de dependência de biblioteca forçando os programadores a agrupar todas as bibliotecas que usam em seus programas. No Linux, é incomum fazer isso, com a vantagem de que os programadores não precisam agrupar bibliotecas e de que os usuários obtêm atualizações de segurança e correções de bugs para bibliotecas em tempo hábil, mas com o custo de que os programas precisam ser compilados de maneira diferente para diferentes versões de distribuições. .

Portanto, você deve rotular seu binário como “Linux, PC de 64 bits (amd64), compilado para Ubuntu 17.04” (ou “PC de 32 bits (i386)” se este for um executável de 32 bits) e fornecer os detalhes do bibliotecas necessárias. Você pode ver as bibliotecas usadas por um executável com o lddcomando: run ldd program. A parte anterior =>é o que importa, por exemplo, libgtk-3.so.0é a biblioteca principal do GTK3, com versão 0 (se alguma vez existisse uma versão 1, seria incompatível com a versão 0, por isso alterei o número da versão). Algumas dessas bibliotecas são coisas que todos teriam de qualquer maneira, porque não mudam há muitos anos; somente a experiência ou uma comparação observando múltiplas distribuições e vários lançamentos pode lhe dizer isso. Usuários de outras distribuições podem executar o mesmo binário se tiverem versões compatíveis das bibliotecas.

informação relacionada