Frage

Ich baue einige Befehlszeilenprogramme in Xcode (plain C, kein Kakao). Ich möchte sie all meine angepasste Version von libpng verwenden, und ich möchte, um Platz zu sparen, indem unter allen ausführbaren Dateien eine Kopie der Bibliothek zu teilen (ich weiß nicht neu verteilen .dylib mit ihnen etwas dagegen).

Muss ich etwas Magie tun Exportsymbole zu erhalten libpng?

Does "Link Binary Mit Bibliotheken" Phase Link statisch bauen?

Apples docs erwähnt Laden von Bibliotheken zur Laufzeit mit dlopen, aber wie ich Xcode erstellen ausführbarer Datei, ohne klagen über fehlende Symbole machen?


Ich glaube, ich habe es herausgefunden:

  • libpng wurde die Verknüpfung nicht richtig, weil ich 32/64-Bit-Programme und 32-Bit-Bibliothek aufgebaut habe. Erstellen Sie Einstellungen der Bibliothek und ausführbare Dateien müssen übereinstimmen.

  • libpng der config.h braucht Tonnen definiert wie #define FEATURE_XXX_SUPPORTED haben

  • "Link-Binary mit Bibliotheken" baut Phase behandelt dynamische Bibliotheken ganz gut, und DYLD_FALLBACK_LIBRARY_PATH Umgebungsvariable ist notwendig für das Laden .dylibs von Anwendungspaket.

War es hilfreich?

Lösung

Sie müssen wahrscheinlich um sicherzustellen, dass die dynamische Bibliothek Sie eine exportierte Symboldatei erstellen hat, die auflistet, was aus der Bibliothek exportiert werden sollen. Es ist nur eine einfache Liste der Symbole, eines pro Zeile, zu exportieren.

Auch wenn Ihre dynamische Bibliothek gebaut wird, wird es eine installieren name eingebettet in ihm die standardmäßig ist, wird der Pfad, an dem es gebaut ist. Anschließend alles, was gegen sie verknüpft wird zunächst auf dem angegebenen Pfad danach suchen und erst danach eine (kleine) Gruppe von Standardpfaden unter DYLD_FALLBACK_LIBRARY_PATH in dem dyld(1) Mann .

Wenn Sie vorhaben, diese Bibliothek setzen neben ausführbaren Dateien, sollten Sie das installiert anpassen Namen, der referenzieren. tut eine Google-Suche einfach nach „installieren namen“ sollte eine Unmenge an Informationen zu tun, dass wieder auftauchen.

Andere Tipps

Dynamische Verknüpfung auf Mac OS X, ein winziges Beispiel

Schritte:

  1. Erstellen Sie eine Bibliothek libmylib.dylib enthält mymod.o
  2. kompilieren und verknüpfen Sie eine "callmymod", die es nennt
  3. Anruf mymod von callmymod, mit DYLD_LIBRARY_PATH und DYLD_PRINT_LIBRARIES

Problem: Sie einfach „nur“ wollen eine Bibliothek für andere Module erstellen zu verwenden. Allerdings gibt es einen gewaltigen Haufen von Programmen - gcc, ld, MacOSX libtool, dyld - mit Myriaden von Optionen, einige gut verrotteten Kompost, und die Unterschiede zwischen Mac OS X und Linux. Es gibt Unmengen von Menschen Seiten (ich zähle 7679 + 1358 + 228 + 226 Zeilen in 10.4.11 ppc) aber nicht viel im Wege von Beispielen oder Programme mit einem „mir sagen, was du tust“ -Modus.

(Das Wichtigste in Verständnis ist eine vereinfachte zu machen ÜBERBLICK selbst: zeichnen einige Bilder, laufen einige kleine Beispiele, erklären es an jemand anderen).

Hintergrund: Apfel OverviewOfDynamicLibraries , Wikipedia Dynamic_library


Schritt 1 erstellen libmylib.dylib -

mymod.c:
    #include <stdio.h>
    void mymod( int x )
    {
        printf( "mymod: %d\n", x );
    }
gcc -c mymod.c  # -> mymod.o
gcc -dynamiclib -current_version 1.0  mymod.o  -o libmylib.dylib
    # calls libtool with many options -- see man libtool
    # -compatibility_version is used by dyld, see also cmpdylib

file libmylib.dylib  # Mach-O dynamically linked shared library ppc
otool -L libmylib.dylib  # versions, refs /usr/lib/libgcc_s.1.dylib

Schritt 2, kompilieren und verknüpfen callmymod -

callmymod.c:
    extern void mymod( int x );
    int main( int argc, char** argv )
    {
        mymod( 42 );
    }
gcc -c callmymod.c
gcc -v callmymod.o ./libmylib.dylib -o callmymod
    # == gcc callmymod.o -dynamic -L. -lmylib
otool -L callmymod  # refs libmylib.dylib
nm -gpv callmymod  # U undef _mymod: just a reference, not mymod itself

Schritt 3 laufen callmymod libmylib.dylib Verknüpfung -

export DYLD_PRINT_LIBRARIES=1  # see what dyld does, for ALL programs
./callmymod
    dyld: loaded: libmylib.dylib ...
    mymod: 42

mv libmylib.dylib /tmp
export DYLD_LIBRARY_PATH=/tmp  # dir:dir:...
./callmymod
    dyld: loaded: /tmp/libmylib.dylib ...
    mymod: 42

unset DYLD_PRINT_LIBRARIES
unset DYLD_LIBRARY_PATH

Das endet ein kleines Beispiel; hoffen, dass es hilft, die Schritte zu verstehen.
(Wenn Sie dies viel tun, finden Sie unter GNU Libtool die auf MACS glibtool, und SCons .)
prost
  - denis

Leider ist in meiner Erfahrung Apples Dokumentation ist veraltet, überflüssig und eine Menge gemeinsamer Informationen fehlen, die Sie normalerweise benötigen.

schrieb ich ein paar Sachen auf diese auf meiner Website, wo ich BMVg zu bekommen hatte (Sound API) mit meinem Cross-Plattform-Spiel zu arbeiten, die wir an der Uni entwickelt. Es ist eine seltsame Prozess und ich bin überrascht, dass Apple nicht mehr Informationen über ihre Entwickler docs hinzuzufügen.

Leider, wie „böse“, wie Microsoft ist, tun sie eigentlich eine viel bessere Arbeit mit der Dokumentation nach ihrer Devs von suchen (dies wird von einem Apple-Evangelist kommt).

Ich denke, im Grunde, was Sie nicht tun, ist, nachdem Sie Ihre .app-Bundle zusammengestellt. Sie müssen dann einen Befehl auf dem ausführbaren Binärdatei /MyApp.app/contents/MacOS/MyApp laufen, um zu ändern, in dem die ausführbaren Datei für die Bibliotheksdatei aussieht. Sie müssen eine neue Build-Phase erstellen, die ein Skript ausgeführt werden kann. Ich werde diesen Prozess nicht erklären noch einmal, ich habe es schon in der Tiefe getan hier:

http: // brockwoolf .com / blog / how-to-use-dynamic-Bibliotheken-in-Xcode-31-mit-fmod

Hope, das hilft.

Sind Sie sich bewusst von der Apple-Referenzseite Dynamische Bibliothek der Programmierung ? Es sollte die meisten decken, was man braucht. Seien Sie sich bewusst, dass es eine gemeinsam genutzte Bibliotheken, die bedingungslos beim Programmstart geladen werden und dynamisch geladene Bibliotheken (Bundles, IIRC), die bei Bedarf geladen werden, und die beide sind etwas anders auf MacOS X aus den Äquivalenten unter Linux oder Solaris.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top