Ich plane Bibliotheken in meinem C ++ Programm zu verwenden. Die Entwicklung läuft unter Linux, aber die Anwendung ist so konzipiert, dass sie sowohl unter Linux als auch unter Windows kompiliert werden kann. Ich verstehe direkte Entsprechung für gemeinsame Bibliotheken (.so) in Windows ist DLL, richtig?
In Linux mit g ++ kann ich eine gemeinsam genutzte Bibliothek mit -fPIC
und -shared
flags erstellen. AFAIK, für eine gemeinsam genutzte Bibliothek ist keine weitere Codeänderung erforderlich. In einer Windows DLL ist das anders. Dort sollte ich die Funktionen angeben, die mit dllexport exportiert werden sollen , Recht?
Meine Frage ist, wie kann ich diese Situation bewältigen? Ich meine dllexport ist in Linux ungültig und der Compiler wird einen Fehler geben. Aber es ist in Windows erforderlich. Also, wie schreibe ich eine Funktion, die auf beiden Plattformen ohne Code-Änderung kompilieren wird?
Compiler verwendet
Jede Hilfe wäre großartig!
Wir geben __declspec(dllexport)
für die Klasse an:
Sie können dann nach Plattform suchen und nur das Makro in Windows definieren. Zum Beispiel:
%Vor%Wir bauen meistens statische Bibliotheken, damit es mehr Möglichkeiten für dynamische Bibliotheken gibt, aber das Konzept ist das gleiche - benutze einen Präprozessor, um die Zeichenfolge zu definieren, die du in den Windows-Code einfügen musst.
Eine andere Alternative ist die Verwendung einer .def-Datei für Ihr Windows-Projekt. Diese Datei gibt die DLL-Exporte an, sodass Sie Ihre Codebasis nicht durcheinander bringen müssen. (Aber Makros sind definitiv der Weg zu gehen, wenn Sie die zusätzliche Datei vermeiden wollen.)
Sie können #ifdef
preprocessor-Anweisung für das bedingte Kompilieren verwenden. Zum Beispiel:
Eine andere Möglichkeit, die ich jetzt nutze, ist MinGW unter Windows. Auf diese Weise können Sie gcc unter Windows verwenden, und Sie müssen sich nicht um den Declspec-Nonsense kümmern.
Tags und Links c++ windows linux shared-libraries