Ich habe ein Projekt, das eine gemeinsam genutzte Bibliothek erstellt, die mit einer anderen, ebenfalls gemeinsam genutzten Bibliothek verknüpft ist.
Wenn ich es mit gcc 4.4 kompiliere und verlinke, funktioniert alles:
ldd libmyproject.so
meldet die Abhängigkeit korrekt mit der anderen gemeinsam genutzten Bibliothek. Wenn ich es mit gcc 4.5 kompiliere und verknüpfe (mit genau den gleichen Flags), habe ich die folgenden Symptome:
ldd
laufe und die Verbindung nicht sehe, und auch wenn ich versuche, sie zu benutzen: während sie mit gcc 4.4 zusammenarbeitet, stürzt sie ab zur Laufzeit mit gcc 4.5 mit einem "Symbol nicht gefunden" Fehler (natürlich von der anderen lib). Ich habe mir die Versionshinweise angesehen und meine Intuition ist, dass es etwas mit dem Neuen zu tun hat Link-Zeit-Optimierung, aber ich konnte sie nicht in genügend Details verstehen.
Hat jemand auf eine ähnliche Situation gestoßen und / oder hat er einen Ratschlag anzubieten?
(Beachten Sie, dass Ergebnisse mit 4.6 identisch mit 4.5 sind).
Um Mat's Antwort von GCC 4.5 zusammenzufassen vs 4.4 Verknüpfung mit Abhängigkeiten und die Diskussion in den Kommentaren, müssen Sie verknüpfen mit:
%Vor% Sie können Ihre dynamisch verknüpfte Anwendung mit der Umgebungsvariablen LD_DEBUG debuggen. Dies ist eine Option von ld-linux.so.2
; ldd ist ein Skript, um diese Option zu setzen. Alle Optionen sind auf der Manpage Ссылка beschrieben.
Wie benutzt man LD_DEBUG (in bash; der einfachste Weg):
%Vor%Dadurch wird das Debuggen von ld-linux.so.2 - dem dynamischen Laufzeit-Linker - aktiviert. Es wird viel Debugging auf stdout oder stderr gedruckt und Sie können
LD_DEBUG=all ./your_program_4.4
" und " LD_DEBUG=all ./your_program_4.5
" Auch sollten Sie uns mehr Informationen geben:
uname -a
) Was ist die Version von libc? (Lauf in bash for a in /lib*/libc.so.*;do echo $a; $a; done
) UPDATE: Gute und genaue Antwort ist hier: GCC 4.5 vs 4.4 Verknüpfung mit Abhängigkeiten (von Mat)
Stellen Sie sicher, dass Sie Ihre gemeinsam genutzten Bibliotheken nach Ihren Objekt- (oder Quell-) Dateien in der Linker-Befehlszeile angeben.
So mussten Sie es früher mit statischen Bibliotheken tun. Es scheint, mit neuen Versionen von GCC wieder vorteilhaft zu sein. Soweit ich das beurteilen kann, ignoriert es beim Durchsuchen einer gemeinsam genutzten Bibliothek, die keine nützlichen Symbole liefert, die gesamte Bibliothek, wodurch die Anzahl der zur Laufzeit geladenen gemeinsam genutzten Bibliotheken optimiert wird, aber die Optionen -libname
angezeigt werden müssen nach den Objektdateien.
Tags und Links gcc linker shared-libraries