• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Es regnet, ist neblig und kalt, alle sind krank und der Chef wird zunehmend cholerisch. Das Thema des Monats ist also folgerichtig --> Das Grau(en)
    Wir sind gespannt, war Euch dazu einfällt! Zum Wettbewerb --> Klick

Problem beim bauen von .app mit dynamisch gelinkten Libraries

SirRan

Erdapfel
Registriert
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.
 

CarCode

Erdapfel
Registriert
30.04.16
Beiträge
5
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?
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