Linux: GOSTARIA DE SABER OQ É COMPILAÇÃO, PRA Q... [Pergunta]
Publicada por Nilipe em 26/06/2006 - 14:44h:
* Nilipe usa Slackware
GOSTARIA DE SABER OQ É COMPILAÇÃO, PRA Q SERVE....?AJUDEM-ME AI SEMPRE OUÇO FALAREM DISSO MAS NUNCA TIVE UMA EXPLICAÇÃO Q ME EXCLARECESSE OQ É UMA COMPILIÇÃO AO MEU VER ME PARECE SER UMA COMPLICAÇÃO.RSSS, É SÉRIO AJUDEM AI.
SE POSSIVEL POSTA LÁ NA MINHA COMU Q COM CERTEZA NAUM DEVE TER SÓ EU COM ESTA DÚVIDA O NOME DA COMU É DEUS DO SHELL!
Resposta de rskrause em 26/06/2006 - 14:51h:
* rskrause usa Gentoo
* rskrause tem conceito: 8.0
Compilação... Vamos tentar!
Compilação pode ter muitos significados diferentes, mas o principal na informática e linguagens de programação é o seguinte:
Compilar é passar de linguagem estruturada para linguagem lógica interpretável pela máquina.
Na linguagem de programação, quando vc compila um fonte vc está traduzindo ele da linguagem que vc entende (código fonte, LP) para a linguagem que a máquina fala.
No Linux quando vc compila um novo kernel vc está passando os fontes dele para uma imagem binária, executável pelo sistema-base;
Quando vc compila um novo programa no linux vc está passando os fontes dele para um arquivo que o sistema possa entender e executar.
Resposta de R3n4to.L4r4 em 26/06/2006 - 14:52h:
* R3n4to.L4r4 usa Slackware
* R3n4to.L4r4 tem conceito: nenhum voto.
Boa tarde. Compilação é usada para traduzir um programa feito em uma linguagem de alto nível em uma linguagem de máquina, (zeros e uns), para posteriormente ter suas instruções executadas pelo processador, ou seja, cria o executável de um programa escrito em uma linguagem de alto nível, (se ocorrer junto com a compilação a montagem e ligação, claro). Bem compilação é basicamente isso. Espero ter ajudado.
Resposta de Nilipe em 26/06/2006 - 15:03h:
* Nilipe tem conceito: 8.7
QUE EFICIÊNCIA DESTA COMU, NAUM TEM NEM 5 min QUE EU COLOQUEI A PERGUNTA NO AR, TAH PARECENDO MSN.:-p
VALEW PESSOAL, ENTÃO RESUMINDO OQ EU ENTENDI POR COMPILAÇÃO DE UM MODO FIGURATIVO É SÓ UMA TRANSFORMAÇÃO DE PORTUGUÊS PRA INGLÊS.
Resposta de removido em 26/06/2006 - 15:04h:
Muitas pessoas fazem perguntas do tipo: "Dei o make, mas apareceu uma mensagem dizendo de ele não existe" ou "Que que é esse gcc que preciso para compilar o kernel" ou mesmo "O make config diz que não encontrou um tal de target".
A pergunta é: o que você está querendo fazer? Compilar um programa. E o que é compilar um programa?
Compilar é transformar um arquivo legível para o homem (chamado de código-fonte, source file em inglês) para um arquivo legível para a máquina (binário, binary). Quem faz esse trabalho é o compilador.
O código-fonte pode ser escrito usando várias linguagens, mas os mais usados no Linux são as linguagens C e C++. O compilador C/C++ padrão no Linux é o GCC/GPP (e variantes, como o PGCC que é otimizado para processadores Pentium). Até a pouco tempo, existia um compilador chamado EGCS, baseado no GCC. Ele foi criado por um grupo de pessoas que estavam insatisfeitos com o processo de atualização do GCC pela FSF, achando que era muito conservador (lento, em bom português). Mas no começo de 2000, os dois projetos foram novamente unificados com o nome de GCC, ficando a manutenção a cargo do grupo ex-EGCS. Muitas distribuições ainda vêm com o EGCS, mas creio que daqui a pouco todas as distribuições passem a vir com o GCC.
2 E os utilitários...
Muito bem, já sabemos o que é compilar programas e o que usar. E o que é o make?
Se o programa é constituído por vários arquivos, você terá que compilar todos eles e juntá-los (link) corretamente, muitas vezes incluindo bibliotecas (libraries) externos. Para automatizar esse procedimento, normalmente usa-se o comando make. Esse comando lê um arquivo Makefile, onde está determinado o "roteiro" necessário para a compilação do programa.
Aí aparece mais um problema: você quer que esse programa possa ser compilado no Linux, nos *BSD, na Sun, etc, que tem programas/bibliotecas semelhantes mas não idênticos. Ou mesmo no Linux, dependendo da distribuição ou da maneira com que você instalou as bibliotecas, a configuração pode ser diferente (os arquivos podem estar em diretórios diferentes, por exemplo). Portanto, um Makefile que serve para mim pode não servir para você.
O autor do programa poderia escrever um Makefile para cada um desses casos, mas seria um trabalho sem fim! Para isso, criaram um jeito de gerar um Makefile específico para cada sistema, a partir de um roteiro básico que procura os programas e as bibliotecas necessários para a compilação. Esse procedimento é normalmente chamado de "configuração".
Os programas mais utilizados para a configuração são o xmkmf e o autoconf/configure. O kernel Linux não usa esses programas, mas o próprio Makefile cria um arquivo de configuração específico para o seu uso.
3 Bibliotecas e header-files
Com esses programas, você consegue compilar um programeco. Mas só programecos...
Os programas normalmente usam bibliotecas e header-files (não sei direito o que são... acho que são partes do código-fonte reutilizáveis, ao contrário das bibliotecas, que são arquivos binários) externos, pois seria uma bobagem cada um ficar reescrevendo funções que todos os programas usam (algo como a caixa de diálogos do Windows: todos os programas usam o padrão do Windows). O libc (glibc) é uma biblioteca usada por quase todos os programas do Linux; o libjpeg é usada em todos os programas que trabalham com o formato JPEG; e assim por diante.
Aí vem um detalhe a mais: normalmente, essas bibliotecas são divididas em dois pacotes: um para ser usado por programas já compilados (glibc e libjpeg, por exemplo), e um para ser usado na compilação de programas que dependem dele (glibc-devel e libjpeg-devel, por ex.).
Portanto, para compilar programas mais complexos, você precisa ter esses dois pacotes instalados.
4 E o que está faltando?
Muito bem, a pergunta é: como descobrir o que está faltando e causando o erro durante a compilação?
Uma boa leitura nas mensagens de erro já ajuda bastante: se sair um " command not found" ou " comando não encontrado" , deve estar faltando um programa (executável). Normalmente é o gcc ou o make (ou o yacc, ou o as86, ou...), e você consegue "adivinhar" o pacote que está faltando.
Se é uma biblioteca, fica mais complicado pois muitos deles têm nomes bem diferentes do pacote (por exemplo, libXm é do Motif ou Lesstif). Se é um header-file, pior ainda: como é que vou saber onde está o sys/types.h???
Um jeito é vasculhar no CD (usando um "tar ztf" ou "rpm -qpl" com o grep). Mas um pouco de bom-senso ajuda...
1. O glibc-devel é (quase) sempre necessário.
2. Se está compilando um programa para o X, provavelmente o XFree86-devel será necessário.
3. Se no README estiver escrito que o programa usa o Gtk/Qt/Ncurses etc, o pacote "-devel" correspondente será necessário.
4. Por falar em README, sempre leia esse arquivo, juntamente com o INSTALL (se tiver). Mesmo que você não entenda absolutamente nada de inglês, você poderá reconhecer o nome de uma biblioteca. Aí, meu filho, dicionário na mão e mãos à obra...
5. O "make menuconfig" do kernel precisa do ncurses-devel, e o "make xconfig" precisa do tcl e do tk.
Resumindo, para se compilar um programa, você precisa de:
* compilador, que na maioria dos casos é o gcc (ou variantes, como o egcs e o pgcc);
* comando make;
* comando xmkmf e autoconf (para configuração);
* talvez algum outro programa;
* bibliotecas básicas do Linux e outras específicas para o programa; e
* o código fonte do programa, é lógico.
Portanto, antes de tentar compilar um programa, certifique-se que você tem todos os ítens acima.
Para finalizar: você precisa rodar o make onde o arquivo Makefile se encontra. Afinal, o make não consegue adivinhar o que você está querendo compilar, não é?