Erzwingen des Einschlusses von "unbenutzten" Objektdefinitionen in eine Bibliothek

9

Meine Frage ist ähnlich wie diese, scheint aber nicht genau zu korrelieren:

Wie erzwinge die Einbindung einer Objektdatei in eine statische Bibliothek beim Verknüpfen in eine ausführbare Datei?

Forcing-Symbol-Export mit MSVC

Was ich habe, ist ungefähr so:

%Vor%

Nun, in einer concrete_thingy.cpp Datei habe ich:

%Vor%

Natürlich ist das Obige völlig nutzlos, aber hier wird echtes Verhalten abstrahiert.

Dies funktioniert wunderbar, wenn es in einer Anwendung verwendet wird, die als Ganzes kompiliert wird. Das Problem ist jetzt, dass ich diese Technik bisher nicht verwenden kann, während ich das Verhalten hinter collection in einer Bibliothek abfülle. Mit anderen Worten, ich habe eine Datei thingys.lib , die concrete_thingy.cpp enthält, aber die Registrierung findet nicht statt, wenn diese mit einer ausführbaren Datei verknüpft ist. Das collection wird als vorhanden angezeigt und funktioniert gut, ist jedoch leer.

Nun, dies ist eine statische Bibliothek, keine DLL. Das kann das Thema ein wenig verändern und die Techniken, die in den obigen Links erwähnt werden, scheinen nicht zu gelten. Der eine ist natürlich über Funktionen und ich sehe nicht, wie ich es auf diese C ++ - Strukturen anwenden könnte.

Ich habe versucht, die Methode #pragma comment mit den folgenden drei Zeilen (natürlich einzeln) in concrete_thingy.cpp zu verwenden, von denen keiner funktioniert:

%Vor%

Wenn concrete_thingy.cpp in der ausführbaren Datei und nicht in der Bibliothek vorhanden ist, funktioniert alles.

Also, hier sind meine Fragen:

1) Ist es möglich zu tun, was ich versuche? Ich vermute ja, aber ich weiß einfach nicht wie.

2) Wenn es möglich ist, wie bekomme ich MSVC ++ 2010 dazu?

3) Wenn es möglich ist, wie könnte ich es auf eine tragbare Weise tun?

Kurz gesagt, was ich versuche zu tun, wäre vergleichbar mit dem Erstellen einer abstrakten Fabrik, die Implementierungen einer Abstraktion erzeugt. Es weiß nichts über diese Implementierungen, die unter Verwendung von globalen Initialisierungstricks registriert werden. Dies sollte alles in einer statischen Bibliothek sein, mit der eine Anwendung verknüpft werden kann, und diese Implementierungen sollten über diese Factory verfügbar sein. Niemand weiß etwas über diese Implementierungen, außer sich selbst, und daher führt eine normale Verknüpfung dazu, dass diese und ihre Registrierungs-Globals verschwinden.

Es ist nicht genau das, was ich vorhabe, aber es ist nah genug.

Bearbeiten: ================================================ =======

Sieht aus wie dieses Verhalten "nach Entwurf" ist. MS erkennt, dass die Konstruktion von Objekten, die Nebenwirkungen verursachen, unabhängig davon, ob sie verwendet werden oder nicht, eine Lücke im Standard verwenden, die es ihnen erlaubt, keine Übersetzungseinheiten zu enthalten, in denen nichts verwendet wird: \

Ссылка

Die Option / OPT: NOREF wurde entwickelt, um in diesem Fall anscheinend nichts zu tun.

    
Crazy Eddie 08.12.2010, 02:13
quelle

2 Antworten

4

Nun, die anderen Antworten, wo gute Versuche, aber letztlich fruchtlos. Ich werde den Überarbeitungstrick verwenden, aber der Rest scheint ein Ablenkungsmanöver gewesen zu sein; es macht einen Sinn, da die betreffende Vorlage nirgendwo anders verwendet wird, so dass die Tatsache, dass sie nicht explizit instanziiert wird, keinen Unterschied machen sollte ... die Deklaration des Globalen geschieht immer noch in einer Übersetzungseinheit, sie hat Nebenwirkungen ... Ich glaube nicht, dass der Standard es erlaubt, es weg zu optimieren.

Das unglückliche bisschen über den Standard, nicht zu sagen, ob es erforderlich ist, eine Übersetzungseinheit überhaupt aufzunehmen, ist das ultimative Problem. Ich denke, dass C ++ 0x etwas dagegen tut, aber vielleicht nicht ... Jedenfalls fühlt sich MS frei, die Einheit überhaupt nicht einzubeziehen, und da es nicht global ist, wird es letztendlich nicht in der ausführbaren Datei enthalten keiner der anderen Mist passiert.

Was ich mir vorgenommen habe, und es gibt natürlich noch viele andere Möglichkeiten, eine Datei 'tag' Variable zu erstellen. Diese Variable wird dann in einer Funktion zugewiesen, die global zugänglich ist (sie muss zugewiesen oder zugewiesen werden oder die Referenz ist wegoptimiert). Dann muss diese Funktion von der ausführbaren Datei aufgerufen werden.

Ich habe beschlossen, es so zu machen, denn dann funktioniert der Rest immer noch so wie immer. Letztendlich ändere ich mein Verhalten nicht so, wie ich es könnte, wenn ich einfach eine Registrierungsfunktion schreiben würde, die die Typen von Hand registriert. Außerdem kann ich andere Dinge auf diese Weise tun ... Ich muss nur sicherstellen, dass alles, was in diese Klassifizierung von Fucktardery fallen könnte, ein Tag hat und auf dieses Tag zugegriffen wird.

Ich werde eine Reihe von Hilfsmakros schreiben, um dies größtenteils schmerzlos zu machen.

    
Crazy Eddie 08.12.2010, 19:35
quelle
1

Es gibt die Linker-Option / OPT: REF und / OPT: NOREF, auf die über Linker- & gt; Optimierungs- & gt; -Referenzen zugegriffen wird.

    
Puppy 08.12.2010 02:17
quelle

Tags und Links