English | Português

Inicio | Blog | Sobre... | Links


Bibliotecas dinâmicas no Linux

5/3/2008 7:13:23 PM

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$
        



vinicius hisao suzuki - 5/3/2010 3:58:25 PM:

bem resumido e ótimo seu post. era exatamente o que estávamos procurando. obrigado!


vinicius hisao suzuki - 5/4/2010 7:43:10 AM:

bem resumido e ótimo seu post. era exatamente o que estávamos procurando. obrigado!


- 8/31/2010 6:07:10 AM:




- 8/31/2010 6:09:12 AM:





Envie seu comentário:

Nome:
E-mail:
Web site:
Comentário:
Por favor escreva por extenso o número 10: