Невозможно создать dylib для дистрибутива, который работает на OS X 10.5 (сборка в среде 10.6) - PullRequest
2 голосов
/ 23 августа 2011

Я пытаюсь распространять cairo (1.10.2) с моим приложением. Я могу создать обязательно dylib с помощью Homebrew, но они зависят от версий других динамических библиотек, которых нет в OS X 10.5 (libfontconfig, libfreetype и других, расположенных в основном в /usr/X11/lib).

Я предполагаю, что для решения этой проблемы я хочу использовать dylibs в /Developer/SDKs/MacOSX10.5.sdk/usr/X11/lib, а не библиотеки в /usr/X11/lib. Я пробовал все, что мог найти для нацеливания на Каир против 10.5 SDK.

  • Установка MACOSX_DEPLOYMENT_TARGET переменной среды на 10.5 (перед вызовом brew или использованием ENV Homebrew *)
  • Установка SDKROOT переменной среды на "/Developer/SDKs/MacOSX10.5.sdk" (перед вызовом brew или использованием ENV Homebrew *)
  • Добавление -mmacosx-version-min=10.5 к CFLAGS, CXXFLAGS и LDFLAGS в формуле Homebrew для Каира.
  • Добавление -sysroot / -isysroot /Developer/SDKs/MacOSX10.5.sdk к CFLAGS, CXXFLAGS и LDFLAGS в формуле Homebrew для Каира.
  • Добавление -I$(SDKROOT)/usr/X11/include и -I$(SDKROOT)/usr/X11R6/include к CFLAGS и CXXFLAGS в формуле Homebrew для Каира.
  • Добавление -L$(SDKROOT)/usr/X11/lib и -L$(SDKROOT)/usr/X11R6/lib к LDFLAGS в формуле Homebrew для Каира.

При сборке cairo у него есть -I/usr/X11/lib на командах gcc (с опциями в конце), так что я думаю, что сначала это срабатывает. Я не уверен, как избавиться от этого, чтобы он использовал мои варианты. Я думал, что isysroot сделает так, чтобы пути включения и библиотеки были переопределены в SDK, но -isysroot, похоже, не имеет никакого эффекта.

1 Ответ

1 голос
/ 24 августа 2011

Вы должны иметь возможность использовать install_name_tool, чтобы изменить место, где cairo ищет свои библиотеки. (Я понятия не имею, что такое Каир. Я предполагаю, что это дизлиб. Если нет, моя уверенность в этом решении значительно снижается.)

Вот вымышленный пример, который вы должны уметь адаптировать.

Сначала, используйте otool -L, чтобы увидеть, какие библиотеки использует Каир. В этом примере я работаю с libopencv_imgproc.2.3.1.dylib, но вместо этого вы будете использовать имя файла вашей библиотеки cairo:

$ otool -L libopencv_imgproc.2.3.1.dylib 
libopencv_imgproc.2.3.1.dylib:
    lib/libopencv_imgproc.2.3.dylib (compatibility version 2.3.0, current version 2.3.1)
    lib/libopencv_core.2.3.dylib (compatibility version 2.3.0, current version 2.3.1)
    /usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.3)
    /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.9.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.11)

Затем используйте install_name_tool -change, чтобы изменить любой путь, который вам нужно изменить. Первый параметр - это текущий путь к библиотеке, второй - нужный путь к библиотеке, а третий - файл библиотеки. Я говорю это искать libz.1.dylib в /Developer/SDKs/MacOSX10.5.sdk/usr/X11/lib/ вместо /usr/lib:

$ install_name_tool -change /usr/lib/libz.1.dylib /Developer/SDKs/MacOSX10.5.sdk/usr/X11/lib/libz.1.dylib libopencv_imgproc.2.3.1.dylib 

Повторите это для каждой библиотеки, путь которой вам нужно изменить. otool -L показывает нам, что изменение было сделано:

$ otool -L libopencv_imgproc.2.3.1.dylib 
libopencv_imgproc.2.3.1.dylib:
    lib/libopencv_imgproc.2.3.dylib (compatibility version 2.3.0, current version 2.3.1)
    lib/libopencv_core.2.3.dylib (compatibility version 2.3.0, current version 2.3.1)
    /Developer/SDKs/MacOSX10.5.sdk/usr/X11/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.3)
    /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.9.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.11)

В моем примере (и, возможно, в вашем приложении) моя библиотека ожидает, что она окажется где-то кроме пакета приложений, поэтому мне нужно изменить это также с помощью install_name_tool -id. Я копирую библиотеку в папку Frameworks моего пакета приложений, поэтому я советую посмотреть:

$install_name_tool -id @executable_path/../Frameworks/libopencv_imgproc.2.3.1.dylib libopencv_imgproc.2.3.1.dylib

Вы можете поместить вызовы install_name_tool в фазу сборки Run Script. Если вы копируете библиотеку в папку Frameworks вашего пакета приложений, перед именем библиотеки необходимо добавить $BUILT_PRODUCTS_DIR/$FRAMEWORKS_FOLDER_PATH/, чтобы скрипт мог найти библиотеку.

...