dyld: ленивая привязка символа перестала работать

Я приношу извинения за то, что непосредственно ответил на все, но я не знаю полезных учебных руководств, часто задаваемых вопросов, и т.д. В основном то, что следует, составляет 8 лет создания настольных приложений (что я помогаю распределить), разочарование и поиск с помощью Google:

1. Как я выясняю что аргументы передать./настраивать?

Практика действительно. Автоинструменты достаточно легки, поскольку это последовательно. Но существует много материала там с помощью cmake или сделанных на заказ сценариев. Обычно Вам не придется передать ничего для конфигурирования, это должно выяснить, может ли система создать инструмент нечто или нет.

Настройте и инструменты GNU, все заглядывают/,/usr и/usr/local для зависимостей. При установке чего-нибудь где-нибудь еще (который делает вещи болезненными, если зависимость была установлена MacPorts или Fink), необходимо будет передать флаг, чтобы настроить или изменить среду оболочки, чтобы помочь инструментам GNU найти эти зависимости.

2. То, как общие библиотеки работают под OS X / Linux - где они живут на файловой системе, как./настр && делают, находит их, что на самом деле происходит, когда они связаны против

На Linux они должны быть установлены на пути, который может найти динамический компоновщик, это определяется LD_LIBRARY_PATH переменная среды и содержание/etc/ld.conf. На Mac это - то же для большей части программного обеспечения с открытым исходным кодом почти всегда (если это не Проект XCode). Кроме огибающей переменной DYLD_LIBRARY_PATH вместо этого.

Существует путь по умолчанию, что компоновщик ищет библиотеки. Это-/lib:/usr/lib:/usr/local/lib

Можно добавить это при помощи переменной CPATH, или CFLAGS или любого количества других переменных среды действительно (удобно сложный). Я предлагаю CFLAGS как так:

экспортируйте CFLAGS =" $CFLAGS-L/new/path"

-L параметр добавляет к пути ссылок.

Современный материал использует инструмент pkg-конфигурации. Современный материал, который Вы устанавливаете также, устанавливает .pc файл, который описывает библиотеку и где это и как связаться с ним. Это может сделать жизнь легче. Но это не идет с OS X 10.5, таким образом, необходимо будет установить это также. Также много основных deps не поддерживает его.

Действие соединения просто, "разрешают эту функцию во времени выполнения", действительно это - большая таблица строк.

3. Каковы фактические различия между общим и статически связанной библиотекой? Почему я не могу только статически связать все (RAM, и дисковое пространство являются дешевыми в эти дни), и следовательно избегайте странных конфликтов версий библиотеки?

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

Динамические библиотеки имеют тот же код, но когда приложение запущено, код загружается в приложение во времени выполнения (упрощенное объяснение).

Можно статически связаться со всем, однако, печально едва любые системы сборки делают это легким. Необходимо было бы отредактировать файлы системы сборки вручную (например, Makefile.am или CMakeLists.txt). Однако это, вероятно, стоит изучить, устанавливаете ли Вы регулярно вещи, которые требуют различных версий библиотек, и Вы находите зависимости от установки параллельно трудными.

Прием должен изменить строку ссылки от-lfoo до-l/path/to/static/foo.a

Можно, вероятно, найти и заменить. Впоследствии проверьте, что инструмент не связывается с .so или dylib, использующим ldd нечто или otool-L нечто

Другой проблемой не является вся компиляция библиотек к статическим библиотекам. Многие делают. Но затем MacPorts или Debian, возможно, решили не поставить его.

4. Как я могу сказать, какие библиотеки я установил, и что версии?

Если у Вас есть pkg-файлы-конфигурации для тех библиотек, это легко:

pkg-конфигурация - список - все

Иначе Вы часто не можете легко. dylib может иметь soname (т.е. нечто 0.1.dylib, soname 0.1), который совпадает с версией библиотеки. Однако это не требуется. soname является двоичной функцией исчисляемости, необходимо ударить большую часть soname при изменении формата функций в библиотеке. Таким образом, можно добраться, например, версия 14.0.5 soname для 2,0 библиотек. Хотя это не распространено.

Я был расстроен этим видом вещи и разработал решение для этого на Mac, и я говорю об этом затем.

5. Как я могу установить больше чем одну версию библиотеки, не повреждая мою нормальную систему?

Мое решение этого здесь: http://github.com/mxcl/homebrew/

Я люблю устанавливать из источника и хотел инструмент, который помог, но с некоторым управлением пакетом. Таким образом с Домашним пивом я создаю, например, wget сам из источника, но удостоверяюсь, что установил на специальном префиксе:

/usr/local/Cellar/wget/1.1.4

Я затем использую доморощенный инструмент для символьной ссылки все, что в/usr/local, таким образом, у меня все еще есть/usr/local/bin/wget и/usr/local/lib/libwget.dylib

Позже, если мне нужна другая версия wget, я могу установить его в параллели и просто изменить версию, которая связана в/usr/local дерево.

6. Если я устанавливаю материал из источника в системе, которой иначе управляют с помощью пакетов, каков самый чистый способ сделать так?

Я верю Домашнему пиву, путь является самым чистым, так используйте его или сделайте эквивалент. Установите на/usr/local/pkgs/name/version и символьной ссылке или жесткой ссылке остальных в.

Действительно используйте/usr/local. Каждый инструмент сборки, который существует поиски там зависимостей и заголовков. Ваша жизнь будет намного легче.

7. Принятие мне удается скомпилировать что-то трудное из источника, как я могу затем упаковать это так другие люди, не должно переходить через те же обручи? Особенно на OS X....

Если это не имеет никаких зависимостей, можно смолить каталог сборки и дать его кому-то еще, кто может затем сделать, "делают установку". Однако можно только сделать это надежно для тех же самых версий OS X. На Linux это будет, вероятно, работать на подобный Linux (например, Ubuntu) с той же версией Ядра и libc вспомогательной версией.

Причина не легко распределить двоичные файлы на Unix, из-за совместимости на уровне двоичных кодов. Люди GNU, и все остальные часто изменяют их двоичные интерфейсы.

В основном не распределяйте двоичные файлы. Вещи, вероятно, прервут очень странные пути.

На Mac наилучший вариант состоит в том, чтобы сделать macports пакет. Все используют macports. На Linux существует столько различных систем сборки и комбинаций, я не думаю, что существует, любой скорее рекомендует, чем записать запись в блоге о том, как Вы следовали за зданием x инструмент в y странной конфигурации.

Если Вы делаете описание пакета (для macports или домашнего пива) затем, любой может установить тот пакет, и это решает проблемы зависимости также. Однако это часто не легко, и также не легко включать Ваш macports рецепт в основное macports дерево. Также macports не поддерживает экзотические типы установки, они предлагают один выбор для всех пакетов.

Одна из моих будущих целей с Домашним пивом состоит в том, чтобы позволить нажать на ссылку на веб-сайте (например, homebrew://вздор, и это загрузит тот сценарий Ruby, установит deps для того пакета и затем создаст приложение. Но да, еще не сделанный, но не слишком хитрое рассмотрение дизайна я выбрал.

8. Каковы инструменты командной строки, которые я должен освоить для получения хорошим в этом материале? Материал как otool, pkg-сконфигурируйтесь и т.д.

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

Мой набор инструментальных средств, считайте README и УСТАНОВИТЕ файлы и сделайте настраивание - справка. Наблюдайте вывод сборки, чтобы проверить, что это нормально. Проанализируйте любые ошибки сборки. Возможно, в будущем, спросите относительно serverfault :)

0
задан 24 February 2010 в 08:29
1 ответ

Я нашел, что Вы также задали этот вопрос на веб-сайте Домашнего пива оттуда существует ответ.

Ваша проблема была решена путем добавления skip_clean? к Формуле.

1
ответ дан 4 December 2019 в 23:11

Теги

Похожие вопросы