2010-05-03 6 views
5

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 

Antwort

2

Üblicherweise werden undefinierte Referenzen erlaubt, wenn gemeinsam genutzte Objekte verknüpfen, aber Sie können der Linker einen Fehler machen erzeugen, wenn undefinierte Symbole in den Objektdateien, die Sie verknüpfen die erstellen shared library durch Bereitstellen von -z defs an den Linker (oder äquivalent -Wl,-z,defs im gcc-Befehl, der den Linker aufruft).

+0

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

+1

@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. –

Verwandte Themen