Usando classes C++ em bibliotecas .so
-
09-06-2019 - |
Pergunta
Estou tentando escrever uma pequena biblioteca de classes para um curso de C++.
Eu queria saber se era possível definir um conjunto de classes no meu objeto compartilhado e depois usá-las diretamente no meu programa principal que demonstra a biblioteca.Há algum truque envolvido?Lembro-me de ter lido isso há muito tempo (antes de realmente começar a programar) que as classes C++ funcionavam apenas com .dlls MFC e não simples, mas isso é apenas o lado do Windows.
Solução
As classes C++ funcionam bem em bibliotecas compartilhadas .so (elas também funcionam em DLLs não-MFC no Windows, mas essa não é realmente a sua pergunta).Na verdade, é mais fácil que o Windows, porque você não precisa exportar explicitamente nenhum símbolo das bibliotecas.
Este documento responderá à maioria das suas perguntas: http://people.redhat.com/drepper/dsohowto.pdf
As principais coisas a lembrar são usar o -fPIC
opção ao compilar, e o -shared
opção ao vincular.Você pode encontrar muitos exemplos na rede.
Outras dicas
Minha solução/teste
Aqui está a minha solução e faz o que eu esperava.
Código
gato.hh :
#include <string>
class Cat
{
std::string _name;
public:
Cat(const std::string & name);
void speak();
};
gato.cpp :
#include <iostream>
#include <string>
#include "cat.hh"
using namespace std;
Cat::Cat(const string & name):_name(name){}
void Cat::speak()
{
cout << "Meow! I'm " << _name << endl;
}
principal.cpp :
#include <iostream>
#include <string>
#include "cat.hh"
using std::cout;using std::endl;using std::string;
int main()
{
string name = "Felix";
cout<< "Meet my cat, " << name << "!" <<endl;
Cat kitty(name);
kitty.speak();
return 0;
}
Compilação
Você compila a biblioteca compartilhada primeiro:
$ g++ -Wall -g -fPIC -c cat.cpp
$ g++ -shared -Wl,-soname,libcat.so.1 -o libcat.so.1 cat.o
Em seguida, compile o executável principal ou programa C++ usando as classes nas bibliotecas:
$ g++ -Wall -g -c main.cpp
$ g++ -Wall -Wl,-rpath,. -o main main.o libcat.so.1 # -rpath linker option prevents the need to use LD_LIBRARY_PATH when testing
$ ./main
Meet my cat, Felix!
Meow! I'm Felix
$
Pelo que entendi, tudo bem, desde que você esteja vinculando arquivos .so que foram todos compilados usando o mesmo compilador.Diferentes compiladores distorcem os símbolos de maneiras diferentes e não conseguirão vincular.
Essa é uma das vantagens de usar COM no Windows, pois define um padrão para colocar objetos OOP em DLLs.Posso compilar uma DLL usando GNU g++ e vinculá-la a um EXE compilado com MSVC - ou até mesmo VB!