Создание Xcode встроенных необходимых dylibs

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

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

Xcode не позволяет мне добавить ни один из dylib в качестве встроенных двоичных файлов

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

Эпилог

По-видимому, так как мне нужно запустить script, который вызывает install_lib_tool, я сделал довольно универсальный script, который изменит все, что имеет /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

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

Ответ 1

Я никогда не использовал "Встроенные библиотеки", а вместо этого использовал фазу копирования для копирования всех необходимых сторонних библиотек и созданных различными целями в проекте. Вы можете просто перетащить dlilibs, которые вы хотите скопировать, из узлов контура "Рамочные" и "Продукты" в эту фазу копирования (или добавить их с помощью кнопки "+"). XCode также автоматически подпишет каждую библиотеку, если она включена (что по умолчанию):

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)

Другое обсуждение путей загрузчика здесь: Как установить dyld_library_path в Xcode.

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