domingo, 19 de julho de 2015

Hardcore Devel #23 - Bibliotecas

Fala galera. Hoje vamos falar um pouco sobre compilação e desenvolvimento. Todo mundo sabe que desenvolver em módulos é legal. E isso é muito fácil com algumas IDEs. Só que todo esse esquema de desenvolver em módulos já estava pronto bem antes das IDEs. Afinal nós somos bons com abstrações.


Fazer isso por exemplo não é difícil para nós.

Ok. Fractais a parte(Aquilo é um fractal). Nós somos bons em pegar um conjunto de coisas, assumir que elas funcionam e trabalhar com elas. Programação é bem assim. Nós temos um conjunto de primitivas que nós assumimos que funciona e fazemos as coisas conforme nossa necessidade. Isso é abstração, não só aquilo que você vê no museu de arte moderna.

Então qual é a brincadeira. Você separa o seu programa por módulos e vai acoplando tudo aos poucos. Só que existem algumas técnicas interessantes para você fazer isso. Quando você está trabalhando com uma IDE mais popular, como o Eclipse ou o Visual Studio, você não sente isso. Na verdade, a compilação que eles fazem não é nem um pouco modular na maioria dos casos, mas eles mostram tudo pra você de uma forma organizada.

Mas fazer organizado já são outros 500.

A idéia de fazer tudo modularizado, é que você precise executar menos vezes o trabalho de compilação sobre um conjunto de códigos. Então vamos lembrar o básico. Você quer compilar uma pequena biblioteca de funções para usar no código principal. Vamos cobrir isso sobre a ótica do C, C++. E antes disso vamos explicitar uma coisa sobre o processo de criar um programa executável a partir de um código fonte.

Existem duas etapas. Compilação e Ligação.

Compilação pega todo aquele código fonte, que se você tiver sorte você consegue ler, e converte para um código objeto que você provavelmente não consegue ler. Esse é todo o trabalho da compilação. O código objeto não tem obrigação nenhuma de funcionar. Os compiladores nada mais são que tradutores. A grande brincadeira é que o código objeto é algo que o Linker consegue entender. E é ele quem faz a grande magia. Se você quiser apenas compilar um código em C, ou C++, você pode fazer assim:

gcc -c arquivo.c

Isso vai gerar o arquivo.o. Note que é importante que o arquivo termine com .c nesse caso pois o compilador usa isso pra saber que tipo de código tem no arquivo. Você não vai conseguir executar o código desse arquivo! O seu programa não está pronto! Você ainda precisa ligá-lo! Suponha que o seu programa de fato esteja em outro arquivo que precisa do trabalho que você fez no arquivo anterior. Você não precisa compilar o arquivo anterior novamente, você pode fazer um link. Você pode compilar o arquivo do programa e juntar os dois. Por exemplo:

gcc -c programa.c
gcc -o executavel arquivo.o programa.o

O gcc vai chamar o linker pra você e vai ligar os dois códigos e gerar um executável! Mágica! Na verdade o nome do linker é "ld", mas se você tentar chamar o ld por si só passando os arquivos pra ele, você não vai conseguir nada. Isso é porque o gcc chama o ld já passando uma série de arquivos de biblioteca que são necessários para fazer os programas rodarem nos dados sistemas operacionais.

Ah, e você vai ver que o Linker não funciona se não existir a função "main" no seu código fonte. ele vai reclamar com você e não vai gerar um executável.

- Poxa, legal, mas se você tiver varios arquivos .o você vai ter um problema absurdo na hora de compilar porque o compilador vai ter que receber todos esses programas como argumento.

Não, isso é mentira, você pode pegar todos os arquivos .o e gerar uma biblioteca. As vezes quando a gente compila um código que utiliza uma biblioteca a gente adiciona um elemento a mais. Por exemplo, quando eu utilizo a biblioteca SDL pra compilar coisas que tem interface gráfica eu faço o seguinte:

gcc -o executavel programa.o arquivo.o -Lcaminho/para/biblioteca/ -lSDL

E você pode pegar arquivos para fazer uma biblioteca e compilar coisas usando essa biblioteca. É simples! Veja:

gcc -shared -o libBiblioteca.a arquivo.o

Coisa importante. Todo o arquivo de biblioteca para o "ld" precisam começar com o prefixo lib. Então pra fechar nós fazemos:

gcc -o executavel programa.o -Lcaminho/para/biblioteca -lBiblioteca

E o ld vai ligar todo o código com a biblioteca e fazer um programa que funciona, desde que o compilado programa.c tenha uma função main.

E isso é tudo!



Imagens:
http://www.cin.ufpe.br

Nenhum comentário:

Postar um comentário