A seguir vou apresentar um resumo de como criar e usar bibliotecas dinâmicas no
Linux. Para um tutorial mais completo por favor veja:
http://www.ibm.com/developerworks/linux/library/l-dll.html
1) Crie a função que deseja exportar utilizando o modificador extern "C"
como no exemplo abaixo.
extern "C" int soma(int op1, int op2)
{
return op1 + op2;
}
2) Para seguir este exemplo passo a passo, grave o código em um arquivo chamado
"func.cpp", e compile-o utilizando a linha de comando:
g++ -c -fpic func.cpp
3) A extensão utilizada para bibliotecas dinâmicas no Linux é ".so", equivalendo
à extensão ".dll" do Windows. Para linkar o código e gerar a biblioteca, execute
o comando a seguir:
g++ -shared -lc -o func.so func.o
Após executar este comando, será gerado o arquivo "func.so" que é a nossa
biblioteca dinâmica com a função "soma". Para visualizar as funções exportadas
por esta biblioteca, utilize o comando:
nm func.so
4) Agora vamos criar um programa que carrega a biblioteca dinâmica e chama a sua
função. O código para este programa é apresentado abaixo. Por favor grave-o no
arquivo "teste.cpp".
#include <iostream>
using namespace std;
#include <dlfcn.h> // funções para carregar e obter funções de libs dinâmicas
int main()
{
void* pLib = 0;
typedef int (*PFUNC_SOMA)(int, int);
PFUNC_SOMA pSoma = 0;
pLib = dlopen("func.so", RTLD_LAZY);
const char* pError = dlerror();
if (pError != 0)
{
cout << "dlopen retornou " << pError << endl;
return -1;
}
pSoma = reinterpret_cast<PFUNC_SOMA> (dlsym(pLib, "soma"));
pError = dlerror();
if (pError != 0)
{
cout << "dlsym nao encontrou funcao soma. erro: " << pError << endl;
dlclose(pLib);
return -1;
}
int res = pSoma(2, 3); // chama a função soma da lib
cout << "resultado: " << res << endl;
dlclose(pLib);
return 0;
}
O header "dlfcn.h" possui as declarações das funções utilizadas para carregar e
obter os ponteiros para as funções da lib dinâmica. As funções usadas neste
exemplo são:
- dlopen(): carrega a biblioteca dinâmica informada; - dlsym(): obtém o ponteiro
para uma função da biblioteca; - dlclose(): descarrega a biblioteca dinâmica,
deve ser usado quando não for mais necessário chamar funções da lib.
5) Para compilar o programa utilize a linha de comando:
g++ -ldl -o teste teste.cpp
6) Pronto. Antes de executar o programa, devemos setar o path onde o sistema irá
procurar por bibliotecas dinâmicas, com o comando abaixo:
export LD_LIBRARY_PATH=.
O diretório "." indica que queremos carregar as libs procurando no diretório
atual, obtendo o mesmo comportamento que no Windows.
Ao executar o programa, a biblioteca "func.so" será carregada e sua função
"soma" será chamada, apresentando o resultado abaixo:
cesar@l1:~/testes$ ./teste
resultado: 5
cesar@l1:~/testes$
bem resumido e ótimo seu post. era exatamente o que estávamos procurando. obrigado!
bem resumido e ótimo seu post. era exatamente o que estávamos procurando. obrigado!