Utilizzo delle classi C++ nelle librerie .so
-
09-06-2019 - |
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.
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!