Problem beim bauen von .app mit dynamisch gelinkten Libraries

Dieses Thema im Forum "macOS-Developer" wurde erstellt von SirRan, 07.09.16.

  1. SirRan

    SirRan Erdapfel

    Dabei seit:
    07.09.16
    Beiträge:
    1
    Hi zusammen,

    ich hoffe ich habe mein Anliegen im richtigen Themenbereich eingestellt. Falls nicht, nicht böse sein ist mein erstes Thema.
    ich bin kein Profi in der Programmierung und habe darum folgendes Problem:

    ich habe eine C++ /Cinder-Applikation (für OS X) mit Xcode (7.3) geschrieben. Dabei habe ich einige dynamisch gelinkte Libraries verwendet (wie z. B. Libsndfile).
    Wenn ich diese App nun bauen lasse denke ich, dass sie nur auf meinem Mac funktioniert, da auf anderen Geräten ja die Libraries nicht bzw. an anderer Stelle installiert sind. Ist das tatsächlich so? (ich besitzte nur diesen einen Mac und kann es darum nicht überprüfen)
    Falls ja:
    Weiß jmd. wie ich die Einstellungen anpasse, damit die dynamisch gelinkten Libraries so eingebunden werden, dass das nicht passiert?

    Danke für eure Hilfe ;)

    PS.: Ich habe nicht vor die App zu veröffentlichen, es handelt sich dabei lediglich um ein Projekt an der Uni, weshalb ich die App an Dozenten weiter geben muss.
     
  2. CarCode

    CarCode Erdapfel

    Dabei seit:
    30.04.16
    Beiträge:
    5
    Ja, richtig vermutet. Ich bin zwar auch kein Profi, aber *.dylibs, die nicht zum Betriebssystem gehören, müssen mit dem Programm-Bundel weitergegeben werden, damit das Programm auch auf einer anderen Maschine funktioniert. Üblicherweise (jedenfalls mache ich es so) werden solche dylibs in einem Verzeichnis "Frameworks" untergebracht, daß sich unter "Contents" befindet. Damit diese dylibs auch von der App gefunden werden (die eigentliche App ist ja unter Contents/MacOS/), müsssen die dylibs vorher mit dem Befehl install_name_tool bearbeitet werden. Siehe dazu mit Terminal-Befehl: man install_name_tool
    Überprüfe das mit dem Terminal-Befehl: man otool
    Verwende also: otool -L Dateiname

    Ein komplettes Beispiel wäre das folgende Shell-Script:
    #!/bin/sh

    #
    # Fixes runtime linker references to not be absolute, but relative (e.g. @rpath
    # or @executable_path).
    #
    # Usage: fixup-dylib-deps.sh <old_prefix> <new_prefix> <dylibs_dir> <binaries>
    #
    # Both the binaries and dylibs in <dylibs_dir> are modified
    #
    # For example, Gettext binaries are build with //lib prefix by build/deps.xml,
    # see:
    # $ otool -L deps/bin-osx/Debug/gettext/bin/xgettext
    # deps/bin-osx/Debug/gettext/bin/xgettext:
    # /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 744.18.0)
    # //lib/libgettextsrc-0.18.3.dylib (compatibility version 0.0.0, current version 0.0.0)
    # //lib/libgettextlib-0.18.3.dylib (compatibility version 0.0.0, current version 0.0.0)
    # /usr/lib/libxml2.2.dylib (compatibility version 10.0.0, current version 10.8.0)
    # /usr/lib/libncurses.5.4.dylib (compatibility version 5.4.0, current version 5.4.0)
    # //lib/libintl.8.dylib (compatibility version 10.0.0, current version 10.2.0)
    # /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)
    # /usr/lib/libexpat.1.dylib (compatibility version 7.0.0, current version 7.2.0)
    # /usr/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0)
    #
    # To fix this, run this script as follow:
    #
    # fixup-dylib-deps.sh "//lib" "@executable_path/../lib" \
    # deps/bin-osx/Debug/gettext/lib \
    # deps/bin-osx/Debug/gettext/bin/*
    #
    # Resulting in:
    #
    # $ otool -L deps/bin-osx/Debug/gettext/bin/xgettext
    # deps/bin-osx/Debug/gettext/bin/xgettext:
    # /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 744.18.0)
    # @executable_path/../lib/libgettextsrc-0.18.3.dylib (compatibility version 0.0.0, current version 0.0.0)
    # @executable_path/../libgettextlib-0.18.3.dylib (compatibility version 0.0.0, current version 0.0.0)
    # /usr/lib/libxml2.2.dylib (compatibility version 10.0.0, current version 10.8.0)
    # /usr/lib/libncurses.5.4.dylib (compatibility version 5.4.0, current version 5.4.0)
    # @executable_path/../libintl.8.dylib (compatibility version 10.0.0, current version 10.2.0)
    # /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)
    # /usr/lib/libexpat.1.dylib (compatibility version 7.0.0, current version 7.2.0)
    # /usr/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0)

    set -e

    OLD_PREFIX="$1"
    NEW_PREFIX="$2"
    DYLIBS_DIR="$3"

    shift 3

    binaries=$*
    dylibs="$DYLIBS_DIR"/*.dylib

    for binary in $binaries $dylibs ; do
    echo "fixing dylib references in $binary..."
    for dylib in $dylibs ; do
    libname=`basename $dylib`
    install_name_tool -change "$OLD_PREFIX/$libname" "$NEW_PREFIX/$libname" $binary
    done
    done