Frage

In C ++ statische Bibliothek A in dynamischen Bibliotheken B und C verknüpft ist Wenn eine Klasse, Foo, in A verwendet wird, die in B definiert ist, wird C-Verbindung, wenn es nicht Foo nicht verwendet?

dachte ich, die Antwort war ja, aber ich bin mit jetzt ein Problem mit xlc_r7 wo Bibliothek C sagt Foo ein undefiniertes Symbol ist, das es bis C betroffen ist. Mein Problem mit diesem ist Bibliothek C die Klasse nicht verwendet sie verweist. Diese Links in Win32 (VC6) und OpenVMS.

Ist das ein Linker Diskrepanz oder ein PBCAK?

Neue Info:

  1. B ist abhängig von C, aber nicht umgekehrt.

  2. Ich bin nicht mit / OPT: REF auf Windows zu verknüpfen und sie verbindet, ohne Frage.

War es hilfreich?

Lösung

Wenn Sie statisch verknüpfen, zwei Module werden eins. Also, wenn Sie C und die Verbindung A in kompilieren, sein, als ob Sie den gesamten Quellcode von A in den Quellcode von C kopiert hatte, dann die kombinierte Quelle zusammengestellt. So C.dll enthält A, die eine Abhängigkeit von B über Foo hat. Sie müssen C zu B Link-Bibliothek verknüpfen, um diese Abhängigkeit zu erfüllen.

Beachten Sie, dass Ihre Daten nach, dies wird eine zirkuläre Abhängigkeit zwischen B und C erstellen.

Andere Tipps

Klingt wie es ist wahrscheinlich der Linker (ld / Unix), wie (die meisten Versionen, die ich verwendet von haben) ld verbindet die Bibliotheken in von links nach rechts - und wenn es eine Referenz in der ersten, die von erforderlich ist eine später eine des üblicher Trick ist, die erste Bibliothek (oder jede gewünschte Bibliothek) bis zum Ende des Befehls.

anhänge

Es ist ein versuchen und sehen ....

Ist Ihr Link Linie für C einschließlich der Export lib für B? Wenn ja, dann wie Richard vorschlagen, es klingt wie eine Bestell Sache.

Ein weiterer Vorschlag ist, um zu sehen, ob es eine Linker-Option ist nicht referenzierte Symbole zu ignorieren, wenn C Für den Microsoft-Linker dies mit dem / OPT erreichte nicht, dass die Funktionalität von A. benötigen. REF Schaltern

Der einzige Grund, warum C würde nicht Link ist, dass der Compiler denkt, dass es hat müssen die Foo-Symbol.

Da C bezieht sich nicht auf Foo Symbole, es hat einen anderen Grund, warum der Linker das Symbol muss.

Der einzige andere Grund, warum ich kenne, ist ein Export in irgendeiner Form. Ich weiß nur von Visual C ++, so schlage ich vor, Sie für einige Äquivalent __declspec( dllexport ) in den vorverarbeiteten Dateien suchen und sehen, was es erzeugt.

Hier ist, was ich tun würde: haben die Präprozessorausgabe in einer separaten Datei gespeichert und für Vorkommen von Foo suchen. Entweder es wird als Export auftreten, oder es wurde in gewisser Weise durch den Compiler verwiesen wird.

Wenn die Definition von bestimmten Funktion nicht benötigt wird, dann wird diese Bibliothek nicht während des Linkens Phase verknüpft werden. In Ihrem Fall, wie die Definition von foo ist in der Bibliothek B und nicht in der Bibliothek C. Somit ist die Bibliothek C nicht in den Speicher geladen werden, während die ausführbare Datei geladen werden.

Aber es scheint, Sie verwenden die foo () Funktion in der Bibliothek C als auch, wegen dem Sie die entsprechenden Fehlermeldung erhalten.

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