2017-02-03 1 views
9

Я пытаюсь сделать что-то довольно простое и типичное, которое использует динамически связанные библиотеки в моем проекте Xcode, а затем развертывает все необходимые библиотеки.Создание Xcode встроенных необходимых dylibs

Однако я должен делать что-то не так, потому что Xcode 8 не позволит мне вставлять файлы .dylib, только рамки! Ниже показано, что происходит, когда я пытаюсь добавить что-либо к Embedded Binaires, dylib просто не отображаются, а Add Other ... добавляет их в проект, но не в Embedded Binaries.

Xcode not allowing me to add any of the dylibs as embedded binaries

Там должно быть очень простой способ сделать это, но я просто не могу найти его ...

Эпилог

Таким образом, очевидно, так как мне нужно, чтобы запустить скрипт, вызывающий install_lib_tool Я сделал довольно универсальный скрипт, который изменит все, что имеет /local/ по пути к пути встроенной копии:

#!/bin/sh 

app=$BUILT_PRODUCTS_DIR/$EXECUTABLE_PATH 
fw_path=$BUILT_PRODUCTS_DIR/$FRAMEWORKS_FOLDER_PATH 
app_dyl_list=(`ls $fw_path | grep dylib`) 

function change_paths { 
    local bin=$1 
    echo change_path $bin 
    dyl_list=(`otool -L $bin | grep local | awk '{print $1}'`) 

    for dyl in ${dyl_list[*]}; do 
     libname=$(basename $dyl) 
     libname=${libname%%.*} 
     actual_libname=(`ls $fw_path | grep $libname | xargs basename`) 
     install_name_tool -change $dyl "@executable_path/../Frameworks/$actual_libname" $bin 
     printf "\t%s edited\n" $actual_libname 
    done 
} 

change_paths $app 
for dyl_bin in ${app_dyl_list[*]}; do 
    change_paths $fw_path/$dyl_bin 
done 

Затем все, что требуется, - это добавление шага запуска скрипта после копирования dylib, чтобы просто запустить его без аргументов (переменные среды содержат все необходимое).

ответ

11

Я никогда не использовал «Встроенные библиотеки», а вместо этого копировал фазу, чтобы скопировать все необходимые сторонние библиотеки и те, которые были созданы различными объектами в проекте. Вы можете просто перетащить dylibs, которые вы хотите скопировать из узлов «Frameworks» и «Products» в эту фазу копирования (или добавить их с помощью кнопки «+»). XCode будет также автоматически подписывает каждую LIB, если он включен (который по умолчанию):

enter image description here

Возьмите также взглянуть на настройки «Справочник по установке». Вы должны установить это значение в @executable_path /../ Frameworks (при условии, что это ваша фактическая папка фрейма, по крайней мере, это рекомендуется). Значение используется XCode, чтобы установить идентификатор для вашего dylib и имеет важное значение, чтобы сделать их правильно загрузить

enter image description here

Вы можете также использовать инструмент как MacDependency, чтобы проверить информацию о ваших .app, .dylib и .framework пакетов , Он также покажет вам, от каких других библиотек зависит их библиотека и по какому пути она их ожидает. Этот путь должен быть таким же, как идентификатор связанной библиотеки, или загрузка завершится неудачей.

Другим очень полезным инструментом является otool, который поставляется с XCode. Он дает похожие сведения, такие как MacDependency и многое другое. Вот список зависимостей для dylib с путями и версиями ожидаемых им:

Mikes-iMac:Debug mike$ otool -L libcdbc.dylib 
libcdbc.dylib: 
    @executable_path/../Frameworks/libcdbc.dylib (compatibility version 1.0.0, current version 1.0.0) 
    @executable_path/../Frameworks/libwbbase.dylib (compatibility version 1.0.0, current version 1.0.0) 
    @executable_path/../Frameworks/libgrt.dylib (compatibility version 1.0.0, current version 1.0.0) 
    @executable_path/../Frameworks/libgmodule-2.0.0.dylib (compatibility version 3401.0.0, current version 3401.2.0) 
    @executable_path/../Frameworks/libgthread-2.0.0.dylib (compatibility version 3401.0.0, current version 3401.2.0) 
    @executable_path/../Frameworks/libglib-2.0.0.dylib (compatibility version 3401.0.0, current version 3401.2.0) 
    @executable_path/../Frameworks/libmysqlcppconn.7.1.1.8.dylib (compatibility version 7.0.0, current version 7.1.1) 
    /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 307.4.0) 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.0.0) 

Другого обсуждение погрузчиком пути здесь: How to set dyld_library_path in Xcode.

Если ваше приложение или созданная вами библиотека ожидают, что dylibs из системного расположения вместо относительного, это может означать, что вы связали с ним неправильный lib. На этапе сборки «Связывание двоичных» вы можете выбрать библиотеки для ссылок, а в диалоговом окне выбора перечислены все ваши цели проекта.Также для списка компоновщиков вы можете просто перетащить dylib из узла «Продукты» в контур проекта в него, чтобы выполнить настройку. Также для таких библиотек истинно требование установить правильный путь. Это можно сделать со сценарием, который меняет идентификатор после фазы копирования или хранит копию этих библиотек где-то в другом месте, меняет идентификаторы их один раз (например, после их загрузки) и копирует их оттуда в свое окончательное приложение.

+0

Я пробовал это, к сожалению, при запуске приложения он по-прежнему ищет dylib в исходном/usr/local/lib/location, игнорирует встроенные dylib и не запускается должным образом. Вы знаете, как обойти эту проблему? –

+0

Обновлен мой ответ. Надеюсь, это поможет. –

+0

Спасибо, однако это все еще не работает, dylibs скопированы правильно, но пути остаются неизменными, см. Этот скриншот http://i.imgur.com/nuN3o3w.png –

Смежные вопросы