Frage

Ich versuche ++ natürlich eine kleine Klassenbibliothek für C zu schreiben.

ich mich gefragt, ob es möglich ist, eine Reihe von Klassen in meinem gemeinsamen Objekt zu definieren und sie dann direkt in meinem Haupt-Programm, das die Bibliothek Demos. Gibt es irgendwelche Tricks beteiligt? Ich erinnere mich, diese schon vor langer Zeit zu lesen (bevor mir wirklich Programmierung gestartet wird), dass C ++ Klassen nur mit MFC-DLLs gearbeitet und nicht glatt ist, aber das ist nur die Windows-Seite.

War es hilfreich?

Lösung

C ++ Klassen funktionieren in .so Shared Libraries (sie arbeiten auch in nicht-MFC-DLLs auf Windows, aber das ist nicht wirklich Ihre Frage). Es ist tatsächlich einfacher als Windows, da Sie ausdrücklich keine Symbole aus den Bibliotheken exportieren müssen.

Dieses Dokument wird die meisten Ihrer Fragen beantworten: http://people.redhat.com/ Drepper / dsohowto.pdf

Die wichtigsten Dinge zu erinnern, sind die -fPIC Option zu verwenden, wenn die Erstellung und die -shared Option bei der Verknüpfung. Sie können viele Beispiele im Netz finden.

Andere Tipps

Meine Lösung / Prüfung

Hier ist meine Lösung und es tut, was ich erwartet hatte.

Code

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

Compilation

Sie kompilieren die gemeinsame lib zuerst:

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

Dann kompilieren Sie das ausführbare Haupt oder C ++ Programm der Klassen in den Bibliotheken mit:

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

Wie ich es verstehe, das ist in Ordnung, solange Sie eine Verknüpfung .so-Dateien, die alle den gleichen Compiler kompiliert wurden. Verschiedene Compiler mangle die Symbole auf unterschiedliche Weise und wird scheitern zu verbinden.

Das ist einer der Vorteile ist COM unter Windows in Verwendung, definiert es eine Standard-OOP-Objekte in DLLs für die Umsetzung. Ich kann eine DLL mit GNU g ++ kompiliert und verknüpfen es mit einer EXE mit MSVC zusammengestellt - oder sogar VB

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top