domingo, 23 de novembro de 2008

Criando uma "biblioteca" no Linux

Criar uma "shared library" no Linux é mais simples do que parece. A idéia é criar algumas coisas que podem ser ocupadas por diversos programas sem precisar recompilá-las todas as vezes. Distribui-se o ".so" (que é a biblioteca) e o ".h" (que é como uma "lista" das funções disponíveis nela).

Vamos ao super-exemplo:

teste.hpp (é o "header", onde há a definição da classe)
class teste {
public:
int mais1(int);
};
teste.cpp (é onde está a implementação dos métodos da classe)
#include "teste.hpp"

int teste::mais1(int n) {
return n+1;
}
A idéia é transformar isso numa lib para que possa ser reaproveitado. Por exemplo:
#include <iostream>
#include "teste.hpp"

using namespace std;

int main() {
teste t;
cout << t.mais1(21) << endl;
}

Se simplesmente compilar isso com o g++:
$ g++ main.cpp
/tmp/ccgDxT6V.o: In function `main':
main.cpp:(.text+0x64): undefined reference to `teste::mais1(int)'
collect2: ld returned 1 exit status
Agora criando a lib, a partir do teste.cpp
g++ -fPIC -c teste.cpp
g++ -shared -Wl,-soname,libteste.so.1 -o libteste.so.1.0 teste.o
ln -s libteste.so.1.0 libteste.so.1
ln -s libteste.so.1 libteste.so
Observe que o que está em negrito é o que é específico para o nosso teste. o "1.0" é a versão que estamos criando.
A primeira linha gera o arquivo "teste.o", que é o código objeto (http://pt.wikipedia.org/wiki/C%C3%B3digo_objeto)
A segunda gera o arquivo da biblioteca, o libteste.so.1.0
Os dois links seriam criados pelo comando "ldconfig", mas como estamos apenas criando um teste, fazemos "na mão" mesmo.

Depois é só compilar:
g++ -L. -lteste main.cpp
o "-L." indica para buscar libs no diretório atual (deve apontar para onde está o libteste.so)
o "-lteste" indica para o g++ que ele deve incluir a libteste ao compilar.

Funciona, o único detalhe é que temos que levar junto com o executável as bibliotecas...

Fonte: http://www.faqs.org/docs/Linux-HOWTO/GCC-HOWTO.html#AEN643

Nenhum comentário: