Frage

Im Laufe der Monate habe ich einige schöne generisch genug Funktionalität geschrieben, die ich als eine Bibliothek aufbauen wollen und Verknüpfung dynamisch gegen anstatt den Import 50-ungerade Kopf- / Quelldateien.

Das Projekt wird beibehalten in Xcode und Dev-C ++ (Ich verstehe, dass ich zu Befehlszeile gehen könnte zu tun, was ich will) und habe zu verknüpfen gegen OpenGL und SDL (dynamisch in SDL Fall). Zielplattformen sind Windows und OS X.

Was sehe ich überhaupt?

  • Was ist der Einstiegspunkt sein wird meine Bibliothek, wenn es braucht?
  • Was muss ich in meinem Code ändern? (Aufrufkonventionen?)
  • Wie löse ich das? Mein Verständnis ist, dass Header und die kompilierte Bibliothek (DLL, .dylib (, .framework), was auch immer es sein wird) sein müssen für das Projekt zur Verfügung - insbesondere als Template-Funktionalität kann nicht in der Bibliothek aufgenommen werden durch Natur.
  • Was muss ich beachten?
War es hilfreich?

Lösung

würde ich Gebäude als StatC Bibliothek statt einer DLL empfehlen. Viele Fragen des Exports C ++ Funktionen und Klassen gehen weg, wenn Sie dies tun, vorausgesetzt, Sie nur mit Code, der von dem gleichen Compiler erzeugt zu verknüpfen beabsichtigen Sie die Bibliothek gebaut mit.

eine statische Bibliothek zu bauen ist sehr einfach, da es nur eine Sammlung von .o / OBJ-Dateien ist - ein bisschen wie eine ZIP-Datei, aber ohne Komprimierung. Es gibt keine Notwendigkeit, etwas zu exportieren - ist nur die Bibliothek in der Liste der Dateien, die Ihre Anwendung Links mit. Um bestimmte Funktionen oder Klassen zuzugreifen, geben Sie einfach die entsprechende Header-Datei. Hinweis: Sie können nicht von Header-Dateien loszuwerden -. C ++ Kompilierungsmodell, insbesondere für Vorlagen, hängt von ihnen ab

Andere Tipps

Es kann problematisch sein, eine C ++ Klassenbibliothek aus einer dynamischen Bibliothek zu exportieren, aber es ist möglich.
Sie müssen jede Funktion markieren, aus dem DLL exportiert werden (Syntax auf dem Compiler abhängt). Ich stochere, um zu sehen, ob ich finden kann, wie dies von Xcode zu tun. In VC es ist __declspec (dllexport) und in Codewarrior ist es Pragma Export auf / # Pragma Export aus.

Das ist durchaus sinnvoll, wenn Sie im Haus verwenden Ihre binär. ein Problem ist jedoch, dass C ++ Methoden genannt werden unterschiedlich von verschiedenen Compilern. Das bedeutet, dass niemand, der einen anderen Compiler verwendet der Lage, Ihre DLL zu verwenden, es sei denn, Sie exportieren nur C-Funktionen.

Auch müssen Sie die Aufrufkonventionen Übereinstimmung in der DLL stellen Sie sicher, und die DLL-Client. Dies entweder bedeutet, dass Sie die gleiche haben sollte default Aufrufkonvention Flag an den Compiler übergeben sowohl für die DLL oder dem Kunden, oder besser, explizit die Aufrufkonvention auf jede exportierte Funktion in der DLL festgelegt, so dass es wird keine Rolle, was für den Kunden ist die Standardeinstellung.

Dieser Artikel beschreibt die Benennung Ausgabe: http://en.wikipedia.org/wiki/Name_decoration

Die C ++ Standard definiert nicht ein Standard-ABI, und das ist eine schlechte Nachricht für Menschen, die versuchen C ++ Bibliotheken zu bauen. Dies bedeutet, dass Sie ein anderes Verhalten von kompilierten Code erhalten je nachdem, welche Flags es zu kompilieren verwendet wurden, und dass auf mysteriöse Fehler im Code führen kann, dass nur gut und Links erstellt.

Dieses erstreckt sich über nur verschiedene Aufrufkonventionen - C ++ Code kompiliert werden kann, unterstützen oder nicht unterstützen RTTI, Ausnahmebehandlung und mit verschiedenen Optimierungen, die das Speicherlayout der Klasse Instanzen beeinflussen kann, die C ++ Code stützt sich auf

Also, was können Sie tun? Ich würde bauen C ++ Bibliotheken in meinem Source-Tree, und stellen Sie sicher, dass sie als Teil des Build gebaut sind mein Projektes, und dass alle Bibliotheken und der Code, den sie verbindet den gleichen Compiler-Flags verwendet werden.

Beachten Sie, dass Namen Mangeln, die Sie angeblich von zumindest zu verhindern, dass Objektdateien verknüpfen, die mit verschiedenen Compilern / Compiler-Flags kompiliert wurden, nur meistens funktioniert, und es gibt bestimmte Dinge, die Sie tun können, vor allem mit GCC, das in Folge hat Code, der nur gut und nicht zur Laufzeit verknüpft.

Sie haben mit Lieferanten geliefert dynamische C ++ Bibliotheken besonders vorsichtig sein (QT auf den meisten Linux-Distributionen, zum Beispiel.) Ich Instanzen von Hersteller gelieferten Bibliotheken gesehen haben, die in einer Weise zusammengestellt wurden, die bestimmte Dinge nicht richtig funktionieren verhindert. Zum Beispiel, gibt einige Redhat Linux (vielleicht alle) deaktiviert Ausnahmen in QT, die es unmöglich gemacht Ausnahmen in Haupt zu fangen (), wenn die Ausnahmen in einem QT Rückruf geworfen wurden. Fun.

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