Как мне создать динамическую библиотеку (dylib) с помощью Xcode?

StackOverflow https://stackoverflow.com/questions/194485

Вопрос

Я создаю несколько утилит командной строки на Xcode (обычный C, без Cocoa).Я хочу, чтобы все они использовали мою настроенную версию libpng, и я хочу сэкономить место, разделив одну копию библиотеки среди всех исполняемых файлов (я не против повторного распространения .dylib с ними).

Нужно ли мне сотворить какое-то волшебство, чтобы получить символы экспорта libpng?

Делает "Связать двоичный файл с библиотеками" построить фазовую связь статически?

В документах Apple упоминается загрузка библиотек во время выполнения с dlopen, но как я могу заставить Xcode создать исполняемый файл, не жалуясь на отсутствующие символы?


Я думаю, что я понял это:

  • libpng не был связан должным образом, потому что я создал 32/64-разрядные исполняемые файлы и 32-разрядную библиотеку.Параметры сборки библиотеки и исполняемых файлов должны совпадать.

  • файл config.h libpng должен содержать множество определений, таких как #define FEATURE_XXX_SUPPORTED

  • "Связать двоичный файл с библиотеками" фаза сборки отлично обрабатывает динамические библиотеки, и DYLD_FALLBACK_LIBRARY_PATH переменная среды необходима для загрузки .dylibы из пакета приложений.

Это было полезно?

Решение

Вероятно, вам необходимо убедиться, что создаваемая вами динамическая библиотека имеет файл экспортированных символов, в котором перечислено, что должно быть экспортировано из библиотеки.Это просто плоский список символов, по одному в строке, для экспорта.

Кроме того, когда ваша динамическая библиотека собрана, она получает имя установки встроенный в него, который по умолчанию является путем, по которому он создается.Впоследствии все, что ссылается на него, сначала будет искать его по указанному пути и только после этого выполнять поиск по (небольшому) набору путей по умолчанию, описанных в DYLD_FALLBACK_LIBRARY_PATH в dyld(1) справочная страница.

Если вы собираетесь поместить эту библиотеку рядом со своими исполняемыми файлами, вам следует настроить ее установочное имя так, чтобы оно ссылалось на это.Просто выполнив поиск в Google по "имени установки", вы получите массу информации об этом.

Другие советы

Динамическое связывание в Mac OS X, крошечный пример

Шаги:

  1. создайте библиотеку libmylib.dylib, содержащую mymod.o
  2. скомпилируйте и свяжите "callmymod", который вызывает его
  3. вызовите mymod из callmymod, используя DYLD_LIBRARY_PATH и DYLD_PRINT_LIBRARIES

Проблема:вы "просто" хотите создать библиотеку для использования другими модулями.Однако существует огромная куча программ - gcc, ld, macosx libtool, dyld - с миллионами опций, небольшим количеством хорошо перепревшего компоста и различиями между MacOSX и Linux.Существует множество справочных страниц (я считаю 7679 + 1358 + 228 + 226 строки в 10.4.11 ppc) но не так много примеров или программ с режимом "скажи мне, что ты делаешь".

(Самое важное для понимания - составить упрощенный ОБЗОР Для себя:нарисуйте несколько картинок, приведите несколько небольших примеров, объясните это кому-нибудь еще).

Предыстория: обзор динамических библиотек Apple, Динамическая библиотека Википедии


Шаг 1, создайте libmylib.dylib --

mymod.c:
    #include <stdio.h>
    void mymod( int x )
    {
        printf( "mymod: %d\n", x );
    }
gcc -c mymod.c  # -> mymod.o
gcc -dynamiclib -current_version 1.0  mymod.o  -o libmylib.dylib
    # calls libtool with many options -- see man libtool
    # -compatibility_version is used by dyld, see also cmpdylib

file libmylib.dylib  # Mach-O dynamically linked shared library ppc
otool -L libmylib.dylib  # versions, refs /usr/lib/libgcc_s.1.dylib

Шаг 2, скомпилируйте и свяжите callmymod --

callmymod.c:
    extern void mymod( int x );
    int main( int argc, char** argv )
    {
        mymod( 42 );
    }
gcc -c callmymod.c
gcc -v callmymod.o ./libmylib.dylib -o callmymod
    # == gcc callmymod.o -dynamic -L. -lmylib
otool -L callmymod  # refs libmylib.dylib
nm -gpv callmymod  # U undef _mymod: just a reference, not mymod itself

Шаг 3, запустите callmymod, ссылающийся на libmylib.dylib --

export DYLD_PRINT_LIBRARIES=1  # see what dyld does, for ALL programs
./callmymod
    dyld: loaded: libmylib.dylib ...
    mymod: 42

mv libmylib.dylib /tmp
export DYLD_LIBRARY_PATH=/tmp  # dir:dir:...
./callmymod
    dyld: loaded: /tmp/libmylib.dylib ...
    mymod: 42

unset DYLD_PRINT_LIBRARIES
unset DYLD_LIBRARY_PATH

На этом заканчивается один крошечный пример;надеюсь, это поможет понять шаги.
(Если вы делаете это часто, см. В GNU libtool не который является glibtool на компьютерах Mac, и Лепешки.)
ваше здоровье
-- денис

К сожалению, по моему опыту, документация Apple устарела, избыточна и в ней отсутствует много общей информации, которая вам обычно нужна.

Я написал кучу материала по этому поводу на своем веб-сайте, где мне нужно было получить FMOD (Sound API) для работы с моей кроссплатформенной игрой, которую мы разработали в университете.Это странный процесс, и я удивлен, что Apple не добавляет больше информации в свои документы разработчика.

К сожалению, какими бы "злыми" ни были Microsoft, на самом деле они гораздо лучше справляются со своей работой по уходу за разработчиками с помощью документации ( это исходит от евангелиста Apple ).

Я думаю, в основном, то, что вы не делаете, происходит после того, как вы скомпилировали свой пакет .app.Затем вам нужно запустить команду в исполняемом двоичном файле /MyApp.app/contents/macOS/MyApp, чтобы изменить, где исполняемый файл ищет свой файл библиотеки.Вы должны создать новую фазу сборки, которая может запускать скрипт.Я не буду снова объяснять этот процесс, я уже подробно описал его здесь:

http://brockwoolf.com/blog/how-to-use-dynamic-libraries-in-xcode-31-using-fmod

Надеюсь, это поможет.

Знаете ли вы о справочной странице Apple Темы по программированию динамической библиотеки?Это должно охватывать большую часть того, что вам нужно.Имейте в виду, что существуют разделяемые библиотеки, которые загружаются безоговорочно при запуске программы, и динамически загружаемые библиотеки (пакеты, IIRC), которые загружаются по требованию, и эти две несколько отличаются в macOS X от эквивалентов в Linux или Solaris.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top