Gibt es ein eingebautes Linux-Dienstprogramm, das ich verwenden kann, um eine neu kompilierte gemeinsame Bibliothek für externe undefinierte Referenzen zu testen? Gcc scheint intelligent genug zu sein, um nach nicht definierten Symbolen in meiner eigenen Binärdatei zu suchen, aber wenn das Symbol eine Referenz zu einer anderen Bibliothek ist, prüft gcc nicht zur Verbindungszeit. Stattdessen erhalte ich nur die Nachricht, wenn ich versuche, von einem anderen Programm auf meine neue Bibliothek zu verlinken.Test für externe undefinierte Referenzen in Linux
Es scheint ein wenig albern, undefinierte Referenznachrichten in einer Bibliothek zu erhalten, wenn ich ein anderes Projekt kompiliere, also möchte ich wissen, ob ich beim Erstellen der Bibliothek eine Überprüfung aller internen und externen Referenzen durchführen kann zu ihm.
Beispiel Fehler:
make -C UnitTests debug
make[1]: Entering directory `~/projects/Foo/UnitTests`
g++ [ tons of objects ] -L../libbar/bin -lbar -o UnitTests
libbar.so: undefined reference to `DoSomethingFromAnotherLibrary`
collect2: ld returned 1 exit status
make[1]: *** [~/projects/Foo/UnitTests] Error 1
haha, brilliant. Jetzt kann ich feststellen, wer beim Erstellen der Bibliothek die undefinierte Funktion aufruft! Viel besser als eine allgemeine Nachricht beim Verlinken mit der Bibliothek. Prost! Ich bin ein bisschen neugierig, warum ld jetzt nicht aufgelöste Externes in geteilten Bibliotheken erlaubt. – Charles
@Charles: Es ist möglich (wenn ungewöhnlich), Objektsymbole zu teilen, die durch Symbole in den Objektdateien in der ausführbaren Datei aufgelöst werden, also '-z defs' nicht immer Sei was du willst. Es ist auch möglich, dass die Version der Bibliothek, die zum Zeitpunkt des endgültigen Links verwendet wird, nicht die Version ist, die beim letzten Link oder Ladevorgang verwendet wird, so dass der letzte Link funktionieren könnte, selbst wenn '-z defs' einen Fehler früher im Buildprozess erzeugt hätte. In den meisten Situationen, in denen ich gemeinsam genutzte Objekte erstellt habe, funktioniert '-z defs' und ist nützlich. –