2012-03-29 9 views
2

Ich habe GCC 4.6.3 in einem Nicht-System-Pfad auf einem Mac-System installiert und es funktioniert gut. GCC möchte jedoch den Code von libgcc für alle Binärdateien verwenden, die ich kompiliere, und die Ausführung von otool -L zeigt, dass diese kompilierten Programme im Installationspfad von GCC nach libgcc_s.1.dylib suchen. Ich kann dies überschreiben, indem ich -static-libgcc übergebe, das nur die benötigten Dateien in die Binärdatei kompiliert, und das ist in Ordnung. Das Problem ist, dass dies nur mit ausführbaren Dateien funktioniert, nicht mit gemeinsam genutzten Bibliotheken. Wenn ich GCC verwende, um einige Drittanbieter-Bibliotheken zu kompilieren, die ich in einem meiner Programme als .dylib verwenden möchte, suchen diese Bibliotheken immer noch nach libgcc_s.1.dylib im lokalen GCC-Installationspfad , selbst wenn ich -static-libgcc spezifiziere ! Unnötig zu sagen, dass dies ein Problem ist, da es keine Garantie gibt, dass diese Bibliotheken libgcc finden, wenn sie auf einem anderen System laufen.GCC's -static-libgcc funktioniert nicht mit DYLIB-Bibliotheken unter Mac OS X

Ich versuchte dies mit ffmpeg. Wenn ich mir config.log ansehe, wird mit Sicherheit -static-libgcc verwendet. GCC verbindet libgcc nur statisch mit den resultierenden Dylibs. Ich habe sogar die Optionen -nostdlib, -nostartfiles und -nodefaultlibs ausprobiert, aber sie wurden ignoriert. Auch hier habe ich config.log überprüft und sie sind definitiv da!

Antwort

2

Ich glaube, das ist mit dem Auslösen von Ausnahmen über die gemeinsame Bibliothek Grenze zu tun. Diese page sagt:

Es gibt mehrere Situationen, in denen eine Anwendung den gemeinsamen libgcc anstelle der statischen Version verwenden sollte. Die häufigste dieser ist, wenn die Anwendung Ausnahmen über verschiedenen freigegebenen Bibliotheken auslösen und abfangen will. In diesem Fall sollte jede der Bibliotheken als sowie die Anwendung selbst die gemeinsame libgcc verwenden.

Daher ist die G ++ und GCJ Treiber automatisch hinzufügen -shared-libgcc , wenn Sie eine gemeinsam genutzte Bibliothek oder eine ausführbare Haupt bauen, weil C++ und Java Programme in der Regel Ausnahmen verwenden, so ist dies das Richtige zu tun.

Der Rest dieser Abschnitte ergibt eine mögliche Abhilfe (es erscheint), und das ist die GCC-Treiber zu verwenden, um Ihre gemeinsame Bibliothek zu verknüpfen, aber wenn die statisch gelinkte Bibliothek Ausnahmen wirft Sie wahrscheinlich bekommen Segmentierungsverletzung.

+0

Danke. Das Apple-Dokument scheint sich hauptsächlich auf C++ zu beziehen. Alles, was ich bisher getestet habe, war direkt C. Es sagt auch, dass, wenn Sie einen Nicht-GNU-Linker verwenden, die gemeinsame libgcc standardmäßig verlinkt ist. Das sehe ich. Dies scheint ein Linker-Problem zu sein, aber wenn man sich die GCC-Ausgabe von -v ansieht, übergibt sie statische Flags an LD, wenn ausführbare Dateien kompiliert werden, und das funktioniert OK. Vielleicht ignoriert LD die -static-Flags, wenn es aufgefordert wird, gemeinsam genutzte Bibliotheken zu kompilieren. – Synthetix

+0

Ich habe gerade versucht, meine eigene Dylib als Test zu kompilieren und es funktionierte (libgcc wurde statisch verbunden), also weiß ich, dass das möglich ist. – Synthetix