8 Stimmen

Erstellen von Programmbibliotheken in Windows und LINUX [C++]

Ich plane, Bibliotheken in meinem C++-Programm zu verwenden. Die Entwicklung erfolgt auf Linux, aber die Anwendung ist so konzipiert, dass sie sowohl unter Linux als auch unter Windows kompiliert wird. Verstehe ich richtig, dass das direkte Äquivalent für freigegebene Bibliotheken (.so) in Windows DLL ist?

In Linux kann ich mit g++ eine freigegebene Bibliothek unter Verwendung der Flags -fPIC und -shared erstellen. Nach meinem Wissen ist keine andere Codeänderung für eine freigegebene Bibliothek erforderlich. Aber in einem Windows-DLL sind die Dinge anders. Dort muss ich die Funktionen angeben, die mit dllexport exportiert werden sollen, richtig?

Meine Frage ist, wie ich mit dieser Situation umgehe. Ich meine, dllexport ist in Linux ungültig und der Compiler wird einen Fehler ausgeben. Aber es ist in Windows erforderlich. Wie schreibe ich also eine Funktion, die auf beiden Plattformen ohne Codeänderung kompiliert?

Verwendete Compiler

  • g++ - LINUX
  • VC++ - Windows

Jede Hilfe wäre großartig!

9voto

stefanB Punkte 72857

Wir geben __declspec(dllexport) für die Klasse an:

#define EXPORT_XX __declspec(dllexport)

class EXPORT_XX A
{
};

Sie können dann das Betriebssystem überprüfen und das Makro nur auf Windows definieren. Z.B.:

#ifdef WIN32
#define EXPORT_XX __declspec(dllexport)
#else
#define EXPORT_XX
#endif

Wir erstellen hauptsächlich statische Bibliotheken, daher gibt es möglicherweise mehr zu tun für dynamische Bibliotheken, aber das Konzept ist dasselbe - verwenden Sie einen Präprozessor-Makro, um den String zu definieren, den Sie in den Windows-Code einfügen müssen.

0 Stimmen

Vielen Dank. Welche Art von DLL wird in Windows erstellt? Wird es sich um eine COM-DLL handeln? Besteht die Möglichkeit, auf DLL-Hölle-Probleme zu stoßen?

0 Stimmen

Die Verwendung von dllexport führt nicht dazu, dass die dll dem COM-System ausgesetzt wird. Die Chancen auf dll-Höllen hängen davon ab, wie Sie die dll und die Anwendung verteilen. Wenn Sie immer die dlls installieren, die Ihre App benötigt, dann ist das Problem, was diese dll betrifft, kein Problem.

0 Stimmen

@sean e : Danke. Ich werde immer die DLL's installieren, die die App benötigt, in das Anwendungsverzeichnis. Manchmal kann es kleine Updates geben, die einfach eine DLL ersetzen anstatt die ganze Anwendung. Wird das ein Problem sein?

5voto

Peter Ruderman Punkte 11906

Eine weitere Alternative ist, einfach eine .def-Datei für Ihr Windows-Projekt zu verwenden. Diese Datei spezifiziert die DLL-Exporte, so dass Sie Ihren Code nicht durcheinander bringen müssen. (Aber Makros sind definitiv der richtige Weg, wenn Sie die zusätzliche Datei vermeiden wollen.)

0 Stimmen

Die Verwendung von C++-Symbolen in .def-Dateien kann ziemlich unordentlich werden.

0 Stimmen

Je nachdem, was er macht, wenn er mit Bibliotheken eine Art Plugin-Architektur meint, ist er mit einer C-Schnittstelle und .def-Dateien besser dran.

2voto

Alan Haggai Alavi Punkte 69510

Sie können die #ifdef-Präprozessor-Direktive für bedingte Kompilierung verwenden. Zum Beispiel:

#ifdef WIN32
    // Win32-spezifischer Code
#else
    // Sonst
#endif

1voto

Mark Beckwith Punkte 1902

Eine weitere Option, die ich jetzt verwende, ist die Verwendung von MinGW unter Windows. Auf diese Weise können Sie gcc unter Windows verwenden, und Sie müssen sich nicht um den unsinnigen declspec kümmern.

1 Stimmen

Vielen Dank für die Antwort. Nun, dies ist eine Open-Source-Anwendung und ich möchte eine breite Palette von Compilern unterstützen, um die Anwendung erfolgreich kompilieren zu können. Also denke ich, dass all dieser Unsinn erforderlich ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X