Bibliotecas compartilhadas são usadas em qualquer sistema operacional, seja Windows, Linux, Mac OSX ou qualquer *BSD ou *NIX. No Windows este recurso tem o nome de DLL (Dynamic-link Library) com sua extensão .dll, no Mac OSX tem a extensão .dylib e nos outros sistemas UNIX-like(Linux, *BSD) este se chama Shared Object e tem extensão .so. Um entendimento básico sobre o funcionamento deste recurso ajuda muito usuários destes sistemas a resolverem possíveis problemas de falta de bibliotecas.
A nomenclatura de bibliotecas compartilhadas segue um padrão em cada sistema. Nos sistemas Linux o padrão é lib<nome_da_lib><.versão>.so. Podemos exemplificar esta convenção com a biblioteca pthreads no Linux. No Fedora, esta biblioteca está definida como libpthread-2.18.so, e um link libpthread.so para esta biblioteca.
Sobre a localização de bibliotecas compartilhadas, no Fedora as libs estão dentro de /usr/lib64. Em sistemas 32 bits, fica dentro de /usr/lib.
Para poder fazer uso de uma shared library utilizando o GCC no Linux basta adicionar um parâmetro -l<nome_da_biblioteca>. O prefixo lib neste caso deve ser removido. Para exemplificar o uso de uma biblioteca na compilação de um programa C/C++ temos o seguinte comando abaixo:
gcc fonte.c -o bin -lpthread
No comando acima estamos compilando o programa fonte chamado fonte.c, gerando um binário com o nome bin e estamos linkando com a biblioteca pthreads do Linux.
Para criar um biblioteca compartilhada é uma tarefa simples. Para iniciar uma biblioteca precisamos criar uma função que será utilizada em outros programas. Como exemplo, irei criar o arquivo soma.c e soma.h para criar uma biblioteca chamada libmatematica.so.
Os arquivos soma.h e soma.c são listados abaixo:
soma.c
int soma(int a, int b)
{
return a + b;
}
soma.h
int soma(int a, int b);
A linha de comando abaixo compila o código fonte soma.c e cria a biblioteca libmatematica.so:
gcc -shared -Wall soma.c -o libmatematica.so
A opção -shared diz ao GCC que o binário compilado será uma biblioteca compartilhada. O arquivo soma.h será utilizada pelos programas que vão usar esta biblioteca. O programa a seguir, chamado main.c, vai utilizar a função soma da biblioteca que criamos:
#include <soma.h>
#include <stdio.h>
int main()
{
printf("%dn", soma(1, 5));
return 0;
}
Para compilar este programa usamos o comando abaixo:
gcc main.c -o main -lmatematica
Ao executar o binário main, obtemos como saída o número 6, número este que é retornado pela função soma da biblioteca libmatematica.so.
Podemos ainda verificar quais bibliotecas um binário específico utiliza. O comando ldd é o responsável por dar tal informação . O comando abaixo mostra quais as bibliotecas utilizadas no binário main recém gerado utiliza.
ldd main
Como saída eu obtive:
[marcos@xfiles teste]$ ldd main
linux-vdso.so.1 => (0x00007fff339fe000)
libmatematica.so => /home/marcos/teste/libmatematica.so (0x00007fb8129fb000)
libc.so.6 => /lib64/libc.so.6 (0x00007fb812612000)
/lib64/ld-linux-x86-64.so.2 (0x00007fb812bfe000)
Algumas observações sobre a biblioteca e o arquivo header. No include foi utilizado os símbolos “<” e “>” ao redor do nome do header. Quando usamos esta notação o compilador espera que o header este dentro da estrutura /usr/include. Para este teste eu movi o arquivo soma.h para lá. Sobre o parâmetro -l<nome_lib>, como já explicado antes, espera-se que a biblioteca esteja dentro de /usr/lib. Para este teste eu criei um link simbólico libmatematica.so dentro de /usr/lib e apontei para a pasta a pasta onde está a minha biblioteca.
Alguns link interessantes sobre o assunto:
http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html
http://linux.die.net/man/1/gcc
http://unixhelp.ed.ac.uk/CGI/man-cgi?ldd+1
Qualquer dúvida, crítica ou sugestão, basta colocar nos comentários! Não se esqueçam de se inscrever no nosso feed! Até mais pessoal!