Coluna do Alexandre COLUNA Bibliotecas estáticas em C Utilizando bibliotecas de forma a melhorar o reaproveitamento de código. N esta coluna, a ideia é revisar os passos necessários para construção de bibliotecas estáticas. Como o leitor sabe, usar bibliotecas é uma maneira de não precisar a todo o momento reinventar a roda e, para uma programação recorrente, poder utilizar funções précompiladas do mesmo modo que já é feito quando usamos chamadas como printf(), scanf(), rand() etc. Portanto, definitivamente, uma biblioteca é uma coleção de arquivos-objetos que estão disponíveis para serem referenciadas quando estamos construindo uma aplicação de maneira que não seja preciso programar novas funções dentro do nosso programa e sim, apenas construir o aplicativo referenciando-as, poupando com isto tempo e esforço. Quando construímos bibliotecas estáticas e as utilizamos na elaboração de uma aplicação, estas são incorporadas no resultado final, não sendo mais necessário tê-las presentes para que o executável funcione. Seguem os arquivos que usaremos para nosso exemplo. A proposta é um programa simples que calcula a área de um quadrado e a área de um triângulo, dados os valores fornecidos pelo usuário. O arquivo area.h fornece as declarações das funções, o arquivo funcao1.c fornece o cálculo do quadrado, o arquivo funcao2.c fornece o cálculo do triângulo e, por fim, o arquivo principal.c representa o nosso programa de teste: Arquivo area.h /* Declaração das funções que calculam as áreas */ #ifndef __AREA_H #define __AREA_H extern int quadrado(int lado1) ; extern float triangulo(int base, int altura); #endif /* __AREA_H */ func1.c : #include <stdio.h> /* Função que calcula a área do quadrado */ int quadrado(int lado) 20 { int areaq ; areaq = lado * lado ; return areaq ; } Arquivo func2.c #include <stdio.h> /* Função que calcula a área do triângulo */ float triangulo(int lado, int altura) { float areat ; areat = (float)(lado * altura)/2 ; return areat ; } Arquivo principal.c #include “area.h” #include <stdio.h> /* Programa de teste */ int main() { int lq ; int bt ; int ht ; int areaquadrado ; float areatriangulo ; printf("Este programa calcula as areas do quadrado e do triangulo.\n\n"); printf("Entre o valor do lado do quadrado: ") ; scanf("%d", &lq) ; printf("Entre o valor da base do triangulo: ") ; scanf("%d", &bt); printf("Entre o valor da altura do triangulo: ") ; scanf("%d", &ht); areaquadrado = quadrado(lq) ; areatriangulo = triangulo(bt,ht) ; http://www.linuxmagazine.com.br printf("\n\nO quadrado de lado %d tem area igual a %d.\n\n",lq,areaquadrado); printf("O triangulo de base %d e altura %d tem area igual a %.2f\n\n",bt,ht,areatriangulo); return ; } Normalmente, faríamos a compilação deste programa da seguinte maneira: # gcc principal.c func1.c func2.c -o linuxmagazine No caso de uso de bibliotecas estáticas, faça: # # # # gcc -c -Wall func1.c gcc -c -Wall func2.c ar -cru libstaticarea.a func1.o func2.o gcc principal.c -L. -lstaticarea -o linuxmagazine O que foi feito? Fácil! Criamos os objetos func1.o e func2.o. Depois foi criada a biblioteca estática e, por fim, usamos a mesma para criar a aplicação linuxmagazine. As opções do comando ar são: -c (cria uma biblioteca estática staticarea, porém é necessário que haja a string lib como parâmetro), -r (troca os objetos existentes na biblioteca estática caso eles já existam) e -u (apenas faz a troca dos objetos se eles forem mais novos do que os já existentes). A opção -L. aponta para o local da biblioteca estática staticarea e -l aponta para a biblioteca em si (não há espaço entre a opção e o nome da biblioteca). Agora é só executar: # ./linuxmagazine Na próxima coluna vamos rever bibliotecas compartilhadas. Até mais! n Alexandre Borges ([email protected], twitter: @ale_sp_brazil) é Especialista Sênior em Solaris, OpenSolaris e Linux. Trabalha com desenvolvimento, segurança, administração e performance desses sistemas operacionais, atuando como instrutor e consultor. É pesquisador de novas tecnologias e assuntos relacionados ao kernel.