2017-12-04 1 views
0

Gibt es eine Standardmethode, um Benutzer zu zwingen, meine DLL-Bibliothek genau in derselben Version zu verwenden, die während der Kompilierung verwendet wird?Wie kann verhindert werden, dass eine Bibliothek verwendet wird, die für eine andere Version kompiliert wurde

Lets ich in der Version 1.0 mit einer Funktion haben Bibliothek übernehmen:

extern "C" void A(); 

In Version 1.1 I brechen Änderung zB hinzugefügt haben: ein weiterer Parameter für diese Funktion so habe ich:

extern "C" void A(int); 

Die exportierte Name in dll ist genau das gleiche, aber wenn der Entwickler das Produkt mit der Version 1.1 kompilieren, dann senden Sie es an den Kunden und der Kunde wird nur das Produkt (exe-Datei) aktualisieren, dann wird alles scheitern. Und es kann in zufälliger Punkt zur Laufzeit fehlschlagen (abhängig davon, wann diese geänderte Funktion ausgeführt wird).

Gibt es Standardmethoden, um das Laden der Bibliothek in falscher Version zu verhindern? Ich bin hauptsächlich mit der Lösung für Windows-DLL-Dateien interessiert. (Aber wenn es spezifische Lösungen für andere Plattformen gibt, bitte Kommentar hinterlassen)

Das obige Beispiel ist vereinfacht. Das Hinzufügen von C++ Mangling löst das obige Problem, aber ich suche nach einer allgemeineren Lösung.

Meine Idee ist, ein statisches Objekt in der Bibliothek Header-Datei hinzuzufügen. Dieses statische Objekt im Konstruktor könnte die Methode aus der Bibliothek ausführen, und die Methode im Namen hat die aktuelle Version wie folgt codiert: init_library_1_1(); Wenn also die Methode in dll fehlt, dann merkt der Benutzer am Anfang, dass etwas nicht stimmt. Aber die Lösung sieht wie ein dreckiger Workaround aus. Und ich muss darauf achten, dass Entwickler diese Datei enthalten.

Gibt es eine bessere Lösung für ein solches Problem?

Antwort

0

Es gibt keine Standardantwort, aber viele Compiler/Linker-Paare haben nicht-standardmäßige Funktionen, um diese Art von Tests durchzuführen.

Visual C++ hat zum Beispiel "#pragma detect_mismatch", die einen Datensatz in der Ausgabeobjektdatei platziert und dann, wenn die Verbindung ausgeführt wird, werden die Datensätze getestet und wenn sie nicht übereinstimmen, wird ein Fehler gemeldet. Ich glaube nicht, dass dies nützlich wäre, wenn die DLL dynamisch während der Laufzeit statt statisch geladen würde. Ich glaube, gcc/clang haben etwas ähnliches, wissen aber nicht die Details.

+0

Danke für den Kommentar. Leider, wenn ich es richtig verstehe, kann es nur helfen, wenn man statische Bibliothek verbindet. Ich suche die Lösung in Runtime. Wenn der Benutzer eine Versionskonflikt zwischen Bibliothek und Anwendung hat, die diese Bibliothek verwenden. – AdamF

Verwandte Themen