Compilação de Aplicações no Linux
Esse post que estou publicando é resultado da anotações que realizei durante o curso de Linux que fiz, por isso não tem nada muito detalhado, serve apenas para lembrar tópicos que foram abordados.
Compilação de programas diretos dos fontes:
Prós:
– permite configurar as opções não existentes nos pacotes originais da distro.
– as correções são implementadas primeiro nos fontes e só depois nos pacotes compilados.
Contras:
– pacote fica especifico para cada instalação apenas
– Perde-se as atualizações automáticas da distro.
– Pode implicar em perda de garantia do fabricante
– Exige instalação de dependências adicionais (“includes”, compilador, etc)
Procedimentos: baixar os fontes do software a ser compilado e descompactar em:
/usr/src – se depender dos fontes do kernel (ex: algum driver) : obrigatorio
/usr/local – caso não dependa dos fontes do kernel (maior parte das aplicações) – recomendado
usr – Unix System Resource
Para compilar o fonte baixado para o diretório /usr/local deve-se executar o script “configure” com as opções corretas indicadas na documentação.
O configure vai:
– checar as dependências (ex: pacotes -devel)
– checar as ferramentas (gcc)
– criar o arquivo makefile
Obs: algumas vezes não existe o configure. nestes casos basta executar o make pois já existe o makefile após usar make, execute make install
Erros mais comuns durante a compilação:
1) Ao executar o “configure” surge uma mensagem similar a: “erro version.h”.
causa: Falta algum pacote “-devel” (pacote de desenvolvimento) estes pacotes quase nunca estão instalados pois só são usados quando compilamos algum software.
Solução:
instale os pacotes “-devel” e reexecute o “configure”.
2) Ao reexecutar o configure surge a mensagem “nada a fazer” e o “configure” aborta de novo.
Causa: quando ocorre um erro, são gerados as arquivos config.log e config.cache
Solução: apague o .log e o .cache e reexecute o “configure”.
3) Ao executar o make, surge a mensagem “ERROR CC_MISMATCH”.
Causa: a versão do compilador “C” (GCC) é diferente da original.
Solução:
1) reinstalar o GCC com a versão correta;
2) exportar a variável abaixo
comando: export IGNORE_CC_MISMATCH=1
reexecute o make;
Carregando uma Biblioteca de Função.
1) Compilando todas as bibliotecas junto com a aplicação, criando um único “executável” – chamamos a isso: “Bibliotecas linkadas estaticamente”
Prós:
– aplicação fica independente do sistema onde será instalada
Contras:
– Aplicação fica maior.
– Perde-se as atualizações automáticas do sistema.
2) Compilando o executável apenas e carregando as bibliotecas do sistema dinamicamente. Chamamos a isso “Bibliotecas linkadas dinamicamente”
Prós:
-Aplicação fica menor
– As atualizações das bibliotecas agora, são automáticas, junto com o sistema.
Contras:
– Agora a aplicação passa a depender do sistema onde será instalada (“Dependências”);
/lib – bibliotecas do sistema
/usr/lib – bibliotecas gráficas
O comando “strings” lê a parte não binaria de um arquivo
O comando ld /usr/sbin/postfix exibe todas as bibliotecas que um executável precisa.
Quando um pacote adiciona uma biblioteca, essa fica listada no arquivo /etc/ld.so.conf após a ferramente “ldconfig” copia o path. dessa nova biblioteca para o cache de bibliotecas /etc/ld.so.cache