Shared libraries são bibliotecas que são carregadas pelos programas quando eles iniciam.
Precisamos entender a diferença entre o nome da biblioteca, soname, e seu real name.
Toda shared library tem um nome especial chamado de "soname". O soname tem o prefixo "lib", o nome da biblioteca, o sufixo ".so" seguido de ponto e um número de versão que é incrementado sempre que a interface muda. Normalmenteo soname é um link simbólico para o real name da shared library.
Exemplo de soname: libctest.so.1
Toda a shareed libray possui um real name. Que é o nome do arquivo que contém o código da biblioteca. O real name adiciona ao soname um ponto, um número, que é o minor number, outro ponto e o número da versão.
Exemplo de real name: libctest.so.1.0
Além disso, há um nome usado pelo compilador para requisitar a library, que é simplesmente o soname sem nenhum número de versão.
Exemplo: libctest.so
Colocando em prática:
Primeiramente vamos ter dois arquivos que são:
operacoes.c – que vai conter nosso código fonte
operacoes.h – que vai conter apenas as definições
Código do arquivo operacoes.c
#include "operacoes.h"
int somaDeInterios (int n1, int n2)
{
return n1 + n2;
}
int multInteiros (int n1, int n2)
{
return n1 * n2;
}
Código do arquivo operacoes.h
#ifndef _OPERACOES
#define _OPERACOES
int somaDeInterios (int n1, int n2);
int multInteiros (int n1, int n2);
#endif
Agora vamos digitar o comandos:
gcc -fPIC -c operacoes.c
Veja que fio gerado o aquivo: operacoes.o
Agora, vamos gerar a nossa library propriamente dita:
gcc -shared -Wl,-soname,libcmatematica.so.1 -o libcmatematica.so.1.0 operacoes.o
Vamos copiar o arquivo gerado: libcmatematica.so.1.0 para dentro da pasta /usr/lib, talvez você deva estar logado como root para executar esse passo:
cp libcmatematica.so.1.0 /usr/lib
Agora vamos criar os links necessários, talvez tenha que estar logado com root:
ln -sf /usr/lib/libcmatematica.so.1.0 /usr/lib/libcmatematica.so
ln -sf /usr/lib/libcmatematica.so.1.0 /usr/lib/libcmatematica.so.1
Bom, agora, vamos criar um simples programa para verificar se a nossa biblioteca realmente funciona.
Vamos chamar nosso arquivo de main.c
Código do arquivo main.c
#include "operacoes.h"
#include <stdio.h>
int main()
{
printf("\n\tTeste da Shared library");
printf("\n\t5 + 2 = %d", somaDeInterios(5,2));
printf("\n\t5 * 2 = %d", multInteiros(5,2));
}
Para compilar:
gcc main.c -lcmatematica -o operacoesInteiras
Resultado:
Teste da Shared library
5 + 2 = 7
5 * 2 = 10