Frage

Ich habe ein Programm (speziell mein Eintrag für die SO DevDays Countdown App Herausforderung ), die stützt sich auf mehrere dynamische Bibliotheken, nämlich libSDL, libSDL_ttf und andere. Ich habe diese unter /opt/local/lib über MacPorts installierten Bibliotheken, und viele Menschen haben nicht diese installiert ist (und einige könnten sie installiert haben, aber nicht an dieser Stelle).

Wie verteile ich mein Programm so, dass die Menschen ohne diese installierten Bibliotheken es laufen kann out-of-the-box? Offensichtlich werde ich die verschiedenen .dylib Dateien verteilen müssen, aber dies nicht ausreicht, um zu tun. Der dynamische Lader sieht immer noch für die an den Standorten installierten Bibliotheken ich sie installiert haben. Gibt es eine Möglichkeit, die dynamischen Lader zu sagen, im aktuellen Verzeichnis der ausführbaren Datei zu suchen, wie, was Windows funktioniert mit DLLs? Die Menschen sollten nicht alle Umgebungsvariablen ändern müssen (z DYLD_LIBRARY_PATH), da wieder möchte ich diese out-of-the-box arbeiten.

War es hilfreich?

Lösung

Wie Sie erwähnen Sie nicht mit Xcode, so ist es ein bisschen schwierig. Hier sind Optionen in meiner Reihenfolge der Präferenz:

  1. Zur Xcode. Verwenden Frameworks. Die SDL-Bibliotheken sind als Frameworks bereits, und ich habe mehr als ein paar kommerziellen Spiele mit einem libsdl.framework in dem App-Bundle.

  2. gesehen
  3. Mit Frameworks, aber halten Sie Ihre Makefiles. Laden Sie die Framework-Versionen Ihrer SDL-Bibliotheken (oder bauen sie selbst), und Verbindung mit ihnen mit der -Framework Linker Flagge. Verteilen Sie die Gerüste mit Ihrer App oder nicht, und erzählen Sie Ihren Benutzern sie setzen entweder in ~ / Library / Frameworks oder in / Library / Frameworks. Ich würde nicht mit einem Installer für diesen stören.

  4. Statisch Link gegen SDL. In der Datei Makefile, werden Sie den Pfad der statischen Bibliotheken auflisten müssen, anstatt die Option -l zu verwenden, zum Beispiel, führen Sie „ld bla bla /opt/local/lib/libsdl.a“. Es gibt keine Möglichkeit, die ich kenne -l zu sagen, statisch zu bevorzugen über gemeinsam genutzte Bibliotheken, und glauben Sie mir, ich habe aussah.

Andere Tipps

Der grundlegende Ansatz dazu ist sie in dem .app Bündel zu versenden. Sie werden dann ändern sich die Position der Linker für gemeinsam genutzte Bibliotheken sieht diese aufzunehmen.

Die Schritte sind:

  1. Erstellen Sie eine neue Kopie von Dateien bauen Phase zu Ihrem Ziel, die Kopien dieser Dateien in den Frameworks-Verzeichnis des .app-Bundle.

  2. , um die Build-Konfiguration bearbeiten "RUNPATH Suchpfade" -Einstellung @executable_path/../Frameworks einschließen

Wenn Sie die ausführbare Datei mit diesen Änderungen bauen und dann schauen, sollten Sie feststellen, dass der dylibs im Foo.app/Contents/Framework Verzeichnis existiert und otool -L Foo.app/Contents/MacOS/Foo ausgeführt wird, sollte nachgeben und Eintrag mit vorangestelltem @rpath für die dylibs.

Von dieser Cocoabuilder Post :

Im Allgemeinen wird @loader_path über @executable_path bevorzugt, da es
in Arbeit sowohl eine ausführbare Datei ermöglicht Frameworks eingebettet und ein Bündel,
Plugin oder Unterkonstruktion. Der einzige Nachteil ist, dass @loader_path
erfordert 10,4 oder höher. Wenn Sie auf 10.5 oder höher sind, @rpath ist sogar
besser als @loader_path.

Statisch verknüpfen die Bibliotheken.

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