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.

Foi útil?

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!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top