Domanda

Sto cercando di scrivere una piccola libreria di classi per un corso C++.

Mi chiedevo se fosse possibile definire un insieme di classi nel mio oggetto condiviso e poi utilizzarle direttamente nel mio programma principale che dimostra la libreria.Ci sono trucchi coinvolti?Ricordo di aver letto molto tempo fa (prima di iniziare davvero a programmare) che le classi C++ funzionavano solo con MFC .dlls e non con quelle semplici, ma questo è solo il lato Windows.

È stato utile?

Soluzione

Le classi C++ funzionano bene nelle librerie condivise .so (funzionano anche in DLL non MFC su Windows, ma non è proprio la tua domanda).In realtà è più semplice di Windows, perché non è necessario esportare esplicitamente alcun simbolo dalle librerie.

Questo documento risponderà alla maggior parte delle tue domande: http://people.redhat.com/drepper/dsohowto.pdf

Le cose principali da ricordare sono usare il file -fPIC opzione durante la compilazione e il file -shared opzione durante il collegamento.In rete puoi trovare moltissimi esempi.

Altri suggerimenti

La mia soluzione/test

Ecco la mia soluzione e fa quello che mi aspettavo.

Codice

cat.hh :

#include <string>

class Cat
{
    std::string _name;
public:
    Cat(const std::string & name);
    void speak();
};

cat.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;
}

main.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;
}

Compilazione

Compila prima la libreria condivisa:

$ g++ -Wall -g -fPIC -c cat.cpp
$ g++ -shared -Wl,-soname,libcat.so.1 -o libcat.so.1 cat.o

Quindi compila l'eseguibile principale o il programma C++ utilizzando le classi nelle librerie:

$ 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
$

A quanto ho capito, va bene purché si colleghino file .so che sono stati tutti compilati utilizzando lo stesso compilatore.Compilatori diversi manipolano i simboli in modi diversi e non riusciranno a collegarsi.

Questo è uno dei vantaggi nell'usare COM su Windows, definisce uno standard per inserire oggetti OOP nelle DLL.Posso compilare una DLL utilizzando GNU g++ e collegarla a un EXE compilato con MSVC - o anche VB!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top