Ich habe ein Makefile für Linux, das ich nach Darwin portiere. Das Makefile nimmt eine Reihe von .o-Dateien und verbindet sie zu einem .so-Objekt. Okay, also dachte ich (liege ich falsch?), Dass das beste Analog in Darwin das Dylib ist. Also habe ich das Flag -shared in -dynamiclib geändert.Was ist der Deal mit undefinierten Symbolen in einer gemeinsam genutzten Bibliothek oder Dylib?
Nun hängt der Code, den ich in der Dylib zusammen bin, von vielen externen Bibliotheken ab. Wenn ich versuche, die Dylib zu erstellen, bekomme ich Fehler, die sagen, dass es nicht definierte Referenzen gibt. Das Linux-Makefile gibt jedoch keine der Optionen -lwhatever oder -L/path/whatever im Build-Schritt an, der die .so-Datei erstellt. Hm? Liegt das daran, dass beim Erstellen einer ELF-.so-Datei standardmäßig externe Referenzen nicht aufgelöst werden und dann beim Laden der gemeinsam genutzten Bibliothek rekursiv gemeinsam genutzte Bibliotheken lädt, die von der gemeinsam genutzten Bibliothek abhängen, die Sie laden? Wäre es nicht so, dass wenn die shared library von einer .a oder .o Datei abhängt, Sie diese statisch in die shared library einbinden müssten, sonst könnten Sie zur Laufzeit nicht verlinken? Wie kommt man mit undefinierten Referenzen in einer Bibliothek, die zur Laufzeit geladen wird, außer die Verweise sind auch auf dynamisch ladbare Bibliotheken? Wie dem auch sei
so, wenn ich angeben
-undefined suppress -flat_namespace
es mich nicht verlangen, um die -l und -L Optionen hinzuzufügen, wenn die gemeinsame Bibliothek zu schaffen. Aber ich verstehe immer noch nicht, wie das letztendlich funktionieren kann.
Danke, ich denke, das wird funktionieren, aber ich bin auch interessiert an dem Hintergrund hinter dem, was passiert. – eeeeaaii
MacOS ist nicht ganz Linux. Es ist schließlich ursprünglich NextOS. Der Linker ist ein bisschen exzentrisch. Fügen Sie -v dem Libtool hinzu und es wird Ihnen sagen, was es macht. – bmargulies