Agora o que significa fazer uma biblioteca (estática)?
RESPOSTA: É separar nossa função (ou procedure ou classe) do nosso programa.
Como fazer isso:
1) Aquilo que chamamos "protótipo da função" vai virar nosso arquivo ".h"! Isso mesmo, aquele arquivo que vai no início dos programas, como por exemplo #include "iostream.h".
2) A função propriamente dita int soma (int a, int b) { .......} que é o corpo matemático da função vai virar um arquivo chamado primeiramente "soma_function.cpp" e depois disso ele será compilado e passará a se chamar : "soma_function.o". A função "soma_function.o" fará parte de uma biblioteca "libsoma_function.a". Mais a frente serão explicados estes passos.
3) Nosso programa principal continuará o mesmo, a única coisa nova agora é que na hora de criar o executável com o g++ ele precisa estar compilado e saber onde está o arquivo "cabeçalho.h" e a biblioteca "libsoma_function.a", porque antes tudo estava dentro do mesmo código e agora tudo está separado.
Então mãos a obra:
Vá à pasta "programas" que você criou anteriormente:
Passo 1) Crie um arquivo texto na pasta programas com o nome soma_head.h com o seguinte conteúdo (leia o comentário!!!):
/* neste arquivo "soma_head.h" só se tem o protótipo da função e não a função propriamente dita. Este arquivo "soma_head.h" somente avisará ao gcc que seu programa deverá usar uma função chamada soma_function.a, a qual fará efetivamente as contas */
int soma(int a, int b);
Passo 2) crie um arquivo texto em /home/programas com o nome soma_function.cpp com isso isso dentro (leia os comentários):
/* este arquivo contém os códigos que farão as contas da função, a qual tem um header (cabeçalho) soma_head.h, Este header (soma_head.h) será incluído no programa principal como # include "soma_head.h", ou seja (mais uma vez), é o protótipo da função estará no arquivo "soma_head.h";
Agora o arquivo "soma_function.cpp" é uma função que fará cálculos, MAS ESTA FUNÇÃO DEVE SER COMPILADA para virar o arquivo soma_function.o */
int soma (int a, int b) //É, precisa declarar as varáveis de novo!
{
int r; // r é uma variável que tem do tipo inteiro
r=a+b; // "r" recebe a soma de dois números "a" e "b"
// que serão fornecidos pelo programa principal.
return (r); // retorna ao programa principal o valor da variável "r"
} // acabou a função
Passo 2.1) Compilando a função soma_function.cpp
É, antes da função virar parte de uma biblioteca ela deve virar um "arquivo.o", ou seja, ser compilada! Pra nosso arquivo "soma_function.cpp" virar o arquivo "soma_function.o" precisamos compilá-lo, e para tanto devemos fazer entrar na pasta onde esta o "soma_function.cpp" e digitar:
$ g++ -c soma_function.cpp functop
A opção -c (compile only) indica ao gcc só pra compilar o soma_function.cpp e não gerar um executável a partir dele, mesmo porque ele é meio incompleto.
Então dentro da nossa pasta programas já temos nosso arquivo "soma_head.h" e o nosso arquivo "soma_function.o" (além do soma_function.cpp e do velho programa_com_função.cpp).
Pra sermos mais geral, temos que criar uma biblioteca ".a", nem que ela tenha pelo menos uma função ".o" (no caso será a nossa função soma_function.o). A saber, bibliotecas são um conjunto de funções (compiladas), que serão ligadas (linkadas) aos nosso programa fonte. Mas para isso precisamos agrupar estas funções na biblioteca.
Então pra gerar a biblioteca ".a" a partir do nosso soma_function.o digitamos no shell (devemos estar dentro da pasta programas):
$ ar rc libsoma_function.a soma_fuction.o
Assim geramos a biblioteca "libsoma_function.a", que contém a função "soma_function.o".
Mas compiladores são terríveis mesmo, depois que você gera uma biblioteca "lib_qualquer.a" eles ainda querem reindexá-las da maneira deles, da forma que eles acham mais fácil de entender, então já que você não pode lutar contra eles, faça isso (em nosso exemplo):
$ ranlib libsoma_fuction.a
A biblioteca libsoma_function.a será a mesma ainda, mas agora como o gcc gosta. Isso fará que o gcc possa manipulá-la digamos, mais eficientemente.