Russian Qt Forum
Май 03, 2024, 11:42 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Deploy Application Bundle  (Прочитано 8504 раз)
Alucard
Гость
« : Апрель 26, 2011, 13:04 »

Привет.

Как на Мас`e поменять привязку к dylib для распространения
нашел install_name_tool, как-то не получилось ничего, т.е. все равно остается зависимость по старому пути.

использовал macdeploy с QtLabs, но получается не со всеми либами.
Речь идет об libvlc.
macdeploy "нормально" копирует и вроде бы(!) "отвязывает". Но только у libvlc.dylib, libvlccore.dylib а libintl.dylib которая тоже используется вышеуказанными либами копируется в Frameworks, но ее не хотят юзать libvlc* либы.
Т.е. все равно остается зависимость по старому пути.

Как избавится от этого? Как заставить использовать либы, которые лежат рядом с исполняемым бинарем?

Слехка сумбурно, но если есть какие-то непонятные моменты, постараюсь объяснить подробней!
Спс.
« Последнее редактирование: Апрель 26, 2011, 13:07 от Alucard » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #1 : Апрель 26, 2011, 13:17 »

заменить полный/относительный путь на @executable_path/path/tolibrary.dylib
Записан
Alucard
Гость
« Ответ #2 : Апрель 26, 2011, 13:31 »

Да это как бы ясно. Не получилось... Догадываюсь что не правильно юзал install_name_tool

в папке с реальной либой
install_name_tool -change path/to/real/lib @executable_path/path/to/library/in/appbundle/lib.dylib libname.dylib
и так
install_name_tool -change libname.dylib @executable_path/path/to/library/in/appbundle/lib.dylib path/to/real/lib
« Последнее редактирование: Апрель 26, 2011, 13:32 от Alucard » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #3 : Апрель 26, 2011, 14:15 »

там 2 параметра - путь в бандле текущий и тот, какой мы хотим сделать. у Вас я 3 вижу почему-то
Записан
Alucard
Гость
« Ответ #4 : Апрель 26, 2011, 14:37 »

http://doc.qt.nokia.com/qq/qq09-mac-deployment.html
тут три
и в help`e
isntall_name_tool [-change old new] .../* остальные параметры */ ... input
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #5 : Апрель 26, 2011, 14:57 »

А, ну да:)
Покажите, что otool -L выводит
Записан
Alucard
Гость
« Ответ #6 : Апрель 26, 2011, 17:08 »

Дык по нему и смотрю... выводит старый путь...
Прийду к Маку - скину
Записан
Alucard
Гость
« Ответ #7 : Апрель 26, 2011, 19:11 »

"otool -L AVR_Solution.app" :
Цитировать
AVR_Solution:
   /usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.3)
   /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.1)
   @executable_path/../Frameworks/libvlc.5.dylib (compatibility version 8.0.0, current version 8.0.0)
   @executable_path/../Frameworks/QtXml.framework/Versions/4/QtXml (compatibility version 4.7.0, current version 4.7.0)
   @executable_path/../Frameworks/QtGui.framework/Versions/4/QtGui (compatibility version 4.7.0, current version 4.7.0)
   @executable_path/../Frameworks/QtCore.framework/Versions/4/QtCore (compatibility version 4.7.0, current version 4.7.0)
   /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.9.0)
   /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 103.0.0)


При запуске приложения выдает:
Цитировать
bash-3.2$ ./AVR_Solution
dyld: Library not loaded: ///Users/user/tmp/vlc-1.1.8/extras/contrib/hosts/i686-apple-darwin10/lib/libintl.8.dylib
  Referenced from: /Users/user/Downloads/AVR_Solution-build-desktop/AVR_Solution.app/Contents/MacOS/./../Frameworks/libvlc.5.dylib
  Reason: no suitable image found.  Did find:
   /usr/local/lib/libintl.8.dylib: mach-o, but wrong architecture
Trace/BPT trap


Цитировать
bash-3.2$ otool -L ../Frameworks/libvlc.5.dylib
../Frameworks/libvlc.5.dylib:
   @executable_path/../Frameworks/libvlc.5.dylib (compatibility version 8.0.0, current version 8.0.0)
   @executable_path/../Frameworks/libvlccore.4.dylib (compatibility version 5.0.0, current version 5.2.0)
   /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.4)
   ///Users/user/tmp/vlc-1.1.8/extras/contrib/hosts/i686-apple-darwin10/lib/libintl.8.dylib (compatibility version 10.0.0, current version 10.1.0)
   /usr/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0)
   /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)


« Последнее редактирование: Апрель 26, 2011, 19:35 от Alucard » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #8 : Апрель 27, 2011, 23:28 »

Цитировать
dyld: Library not loaded: ///Users/user/tmp/vlc-1.1.8/extras/contrib/hosts/i686-apple-darwin10/lib/libintl.8.dylib
  Referenced from: /Users/user/Downloads/AVR_Solution-build-desktop/AVR_Solution.app/Contents/MacOS/./../Frameworks/libvlc.5.dylib
Цитировать
/Users/user/Downloads/AVR_Solution-build-desktop/AVR_Solution.app/Contents/MacOS/./../Frameworks/libvlc.5.dylib
Цитировать
libvlc.5.dylib
в ней тоже надо пути поправить

конкретно вот это:
Цитировать
///Users/user/tmp/vlc-1.1.8/extras/contrib/hosts/i686-apple-darwin10/lib/libintl.8.dylib (compatibility version 10.0.0, current version 10.1.0)
бтв это вообще жесть какая-то, 3 слеша
Записан
ninjaproger
Гость
« Ответ #9 : Ноябрь 03, 2011, 09:50 »

используй утилиту macdeployqt или скомпили Qt из исходников в статическом режиме и используй его - бандл приложения станет в 2-5 раз меньших размеров и никакие библиотеки не нужны
Записан
sendevent
Гость
« Ответ #10 : Ноябрь 03, 2011, 12:10 »

использую под это дело скрипт - возможно,  поможет/чего-нить подскажет:
Код
ASP
#!/bin/bash
 
QTDIR=$1
BUILDDIR=$2
ROOTSOURCEDIR=$3
PATH_2_BUNDLE=$4
 
echo QTDIR=$QTDIR
echo BUILDDIR=$BUILDDIR
echo ROOTSOURCEDIR=$ROOTSOURCEDIR
echo PATH_2_BUNDLE=$PATH_2_BUNDLE
 
readonly BUNDLE_NAME_MAINAPP="Application.app"
readonly BUNDLE_NAME_UPDATER="Updater.app"
readonly BUNDLE_NAME_DUMPLOADER="Dumploader.app"
readonly OWN_PLUGIN_TAIL="Plugin.dylib"
readonly LIBSTYLEPLUGIN="libstyleplugiln.dlib"
 
readonly QT_MAJOR_V=4
 
readonly err_CreateFWSubdir=10
readonly err_CopyFile=20
readonly err_SetFrameworkID=30
readonly err_ChangeFrameworkID=40
 
function cpR {
#echo $FUNCNAME $@
   if ! cp -R "$1" "$2" ;  then
       echo "can't copy "$1" to "$2
       exit $err_CopyFile
   fi
}
 
 
function setID {
#echo $FUNCNAME $@
 
if ! install_name_tool -id $1 $2 ; then
   echo Settinf up id for framework $1 failed!
   exit $err_SetFrameworkID
fi
}
 
function changeID {
#echo $FUNCNAME $@
   if ! install_name_tool -change $1 $2 $3 ; then
       echo "Changing id from
       $1
       to
       $2
       for
       $3
       failed!"

       exit $err_ChangeFrameworkID
   fi
}
 
function updateId_QtLib {
#echo $FUNCNAME $@
QTDIR_lib=$QTDIR/lib
qtDirLength=${#QTDIR_lib}
MODULE=${2:qtDirLength}
FRAMEWORKS="/Frameworks/"$MODULE
ID="@executable_path/.."$FRAMEWORKS
FRAMEWORK=$PATH_2_BUNDLE"/"$3"/Contents"$FRAMEWORKS
 
#echo FRAMEWORK=$FRAMEWORK
if [ ! -e $FRAMEWORK ] ; then
   FIRST_DOT_INDEX=$(echo | awk '
   { print index("'"${MODULE}"'", ".")
   }
   ' )
 
   FW_NAME=${MODULE:0:$FIRST_DOT_INDEX}framework
 
   cpR $QTDIR"lib/"$FW_NAME $PATH_2_BUNDLE/$3/Contents/Frameworks"/"$FW_NAME
fi
 
#setID $ID $FRAMEWORK
changeID $2 $ID $1
}
 
function updateId_OwnPlug {
#echo $FUNCNAME $@
   PLUGIN=$2
   ID="@executable_path/plugins/"$PLUGIN
 
   #setID $ID $FRAMEWORK
   changeID $2 $ID $1
}
 
function updateId_OwnLib {
#echo $FUNCNAME $@
   OWN_LIB=$2
   ID="@executable_path/../Frameworks/"$OWN_LIB
   LIBS_IN_BUNDLE=$PATH_2_BUNDLE"/"$3"/Contents/Frameworks"
   if [ ! -e $LIBS_IN_BUNDLE ] ; then
       mkdir $LIBS_IN_BUNDLE
   fi
 
   FRAMEWORK=$LIBS_IN_BUNDLE"/"$OWN_LIB
 
   echo FRAMEWORK=$FRAMEWORK
   if [ ! -e $FRAMEWORK ] ; then
       cpR $1 $FRAMEWORK
       echo library copied: $1
   fi
 
   #setID $ID $FRAMEWORK
   echo calling changeID $2 $ID $1
   changeID $2 $ID $1
 
}
 
 
function updateDependency {
#echo $FUNCNAME $@
 
   if [ ${dependency:0:1} != "@" ]; then
       qtDirLength=${#QTDIR}
       libStylePlugLen=${#LIBSTYLEPLUGIN}
       isQtLib=${2:0:qtDirLength}
 
       if [ "$isQtLib" == "$QTDIR" ] ; then
       # Starts from QTDIR:
           updateId_QtLib $1 $2 $3
       fi
 
       isOwnLib=${2:0:3}
       if [ "$isOwnLib" == "lib" ]; then
       # Starts from lib:
           PLUGIN=$2
 
           plugTailLength=${#OWN_PLUGIN_TAIL}
           currPluginTail=${PLUGIN:(-$plugTailLength) }
           #if [ ${2:0:libStylePlugLen} == $LIBSTYLEPLUGIN ] ; then
 
           if [ $OWN_PLUGIN_TAIL == $currPluginTail ] ; then
               updateId_OwnPlug $1 $2 $3
           else
               updateId_OwnLib $1 $2 $3
           fi
       fi
   fi
`}
function updateDependencys {
echo FUNCNAME=$FUNCNAME $@
 
   DEPS="$(otool -L $1 | awk '{ print $1 }')"
 
#otool -L $1
 
currentStep=0
   for dependency in $DEPS
   do
       libNameLen=${#dependency}
       depName=${1:(-$libNameLen)}
 
       currentStep=$(( $currentStep + 1 ))
 
       if [ $currentStep -lt 3 ] || [ ${dependency:0:1} == "@" ] || [ "$depName" == "$dependency" ] || [ "${dependency:(-1)}" == ":" ] ; then
           continue
       fi
 
       updateDependency $1 $dependency $2
 
   done
#otool -L $1
}
 
function updateBinaries {
#echo $FUNCNAME $@
 
   for binary in $1
   do
       #echo processing file: $binary
       if [ ! -d $binary ] ; then
           echo file is $binary
           updateDependencys $binary $2
       fi
   done
}
 
 
function updateApp {
   #echo $FUNCNAME $@
   path="$PATH_2_BUNDLE/$1/Contents"
 
   macdeployqt $PATH_2_BUNDLE/$1
 
   updateBinaries "$path/MacOS/*" $1
 
   if [ $1 == $BUNDLE_NAME_MAINAPP ] ; then
       updateBinaries "$path/Frameworks/*.dylib" $1
       updateBinaries "$path/MacOS/plugins/*.dylib" $1
   fi
}
 
libStylePlugins=$PATH_2_BUNDLE/libstyleplugin*.dylib
for libstyleplugin in $libStylePlugins
do
echo moving $libstyleplugin $PATH_2_BUNDLE/$BUNDLE_NAME_MAINAPP/Contents/MacOS/
   mv $libstyleplugin $PATH_2_BUNDLE/$BUNDLE_NAME_MAINAPP/Contents/MacOS/
done
 
ownPlugins=$PATH_2_BUNDLE/$BUNDLE_NAME_MAINAPP/Contents/MacOS/
if [ ! -e $ownPlugins/plugins ] ; then
   cpR  $PATH_2_BUNDLE/plugins $ownPlugins
fi
 
if [ ! -e "$PATH_2_BUNDLE/$BUNDLE_NAME_MAINAPP/Contents/Frameworks" ] ; then
   mkdir "$PATH_2_BUNDLE/$BUNDLE_NAME_MAINAPP/Contents/Frameworks"
fi
 
for f in $PATH_2_BUNDLE/*.dylib
do
echo moving $f $PATH_2_BUNDLE/$BUNDLE_NAME_MAINAPP/Contents/Frameworks/
   mv $f $PATH_2_BUNDLE/$BUNDLE_NAME_MAINAPP/Contents/Frameworks/
done
 
updateApp $BUNDLE_NAME_MAINAPP
updateApp $BUNDLE_NAME_UPDATER
updateApp $BUNDLE_NAME_DUMPLOADER
 
cpR $PATH_2_BUNDLE/$BUNDLE_NAME_UPDATER/Contents/MacOS/Updater $PATH_2_BUNDLE/$BUNDLE_NAME_MAINAPP/Contents/MacOS
cpR $PATH_2_BUNDLE/$BUNDLE_NAME_DUMPLOADER/Contents/MacOS/DumpLoader $PATH_2_BUNDLE/$BUNDLE_NAME_MAINAPP/Contents/MacOS
cpR $PATH_2_BUNDLE/config.ini $PATH_2_BUNDLE/$BUNDLE_NAME_MAINAPP/Contents/MacOS
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.081 секунд. Запросов: 22.