Este é um acompanhamento da compilação da Biblioteca Compartilhada Dinâmica com g ++ .
Estou tentando criar uma biblioteca de classes compartilhadas em C ++ no Linux. Consigo fazer a biblioteca compilar e posso chamar algumas das funções (sem classe) usando os tutoriais que encontrei aqui e aqui . Meus problemas começam quando tento usar as classes definidas na biblioteca. O segundo tutorial ao qual vinculei mostra como carregar os símbolos para criar objetos das classes definidas na biblioteca, mas deixa de usar esses objetos para realizar qualquer trabalho.
Alguém conhece um tutorial mais completo para criar bibliotecas de classes C ++ compartilhadas que também mostra como usar essas classes em um executável separado? Um tutorial muito simples que mostra a criação e o uso de objetos (getters e setters simples seriam bons) e a exclusão seria fantástica. Um link ou uma referência a algum código-fonte aberto que ilustra o uso de uma biblioteca de classes compartilhadas seria igualmente bom.
Embora as respostas de codelogic e nimrodm funcionem, eu só queria acrescentar que peguei uma cópia do Beginning Linux Programming desde que fiz essa pergunta, e seu primeiro capítulo tem exemplo de código C e boas explicações para criar e usar bibliotecas estáticas e compartilhadas . Esses exemplos estão disponíveis na Pesquisa de Livros do Google em uma edição mais antiga desse livro .
fonte
Respostas:
myclass.h
myclass.cc
class_user.cc
No Mac OS X, compile com:
No Linux, compile com:
Se fosse para um sistema de plug-ins, você usaria MyClass como classe base e definiria todas as funções necessárias virtuais. O autor do plugin derivaria do MyClass, substituiria os virtuais e implementaria
create_object
edestroy_object
. Seu aplicativo principal não precisaria ser alterado de forma alguma.fonte
extern "C"
porque adlsym
função é uma função C. E para carregar dinamicamente acreate_object
função, ele usará ligação em estilo C. Se você não usasse oextern "C"
, não haveria como saber o nome dacreate_object
função no arquivo .so, por causa da manipulação de nomes no compilador C ++.A seguir, mostra um exemplo de uma biblioteca de classes compartilhada compartilhada. [H, cpp] e um módulo main.cpp usando a biblioteca. É um exemplo muito simples e o makefile pode ser melhorado. Mas funciona e pode ajudá-lo:
shared.h define a classe:
shared.cpp define as funções getx / setx:
main.cpp usa a classe
e o makefile que gera libshared.so e vincula main com a biblioteca compartilhada:
Para executar 'main' e conectar-se com libshared.so, você provavelmente precisará especificar o caminho de carregamento (ou colocá-lo em / usr / local / lib ou similar).
A seguir, especifica o diretório atual como o caminho de pesquisa para bibliotecas e executa main (sintaxe do bash):
Para verificar se o programa está vinculado ao libshared.so, você pode tentar o ldd:
Imprime na minha máquina:
fonte
-L. -lshared -Wl,-rpath=$$(ORIGIN)
ao vincular e soltar issoLD_LIBRARY_PATH=.
.Basicamente, você deve incluir o arquivo de cabeçalho da classe no código em que deseja usar a classe na biblioteca compartilhada. Em seguida, ao vincular, use o sinalizador '-l' para vincular seu código à biblioteca compartilhada. Obviamente, isso requer que o .so esteja onde o sistema operacional possa encontrá-lo. Veja 3.5. Instalando e usando uma biblioteca compartilhada
O uso do dlsym é para quando você não sabe em tempo de compilação qual biblioteca deseja usar. Isso não parece ser o caso aqui. Talvez a confusão seja que o Windows chama as bibliotecas carregadas dinamicamente se você faz o vínculo no momento da compilação ou do tempo de execução (com métodos análogos)? Nesse caso, você pode pensar em dlsym como o equivalente a LoadLibrary.
Se você realmente precisar carregar dinamicamente as bibliotecas (ou seja, são plug-ins), então estas Perguntas frequentes devem ajudar.
fonte
Além das respostas anteriores, gostaria de aumentar a conscientização sobre o fato de que você deve usar o idioma RAII (Aquisição de Recursos É Inicialização) para estar seguro sobre a destruição do manipulador.
Aqui está um exemplo de trabalho completo:
Declaração de interface
Interface.hpp
::Conteúdo da biblioteca compartilhada:
Manipulador de biblioteca compartilhada dinâmica
Derived_factory.hpp
::Código do cliente:
Nota:
.hpp
e.cpp
arquivos.new
/delete
sobrecarga.Dois artigos claros para obter mais detalhes:
fonte