dyld: библиотека не загружена - когда приложение запускается из командной строки - PullRequest
6 голосов
/ 18 марта 2010

Я сталкиваюсь с некоторыми трудностями при добавлении фреймворка в свой проект при запуске приложения для iPhone из командной строки. Моя конечная цель - запустить тесты приложений из автоматизированного процесса сборки.

Когда я запускаю свое приложение из xCode:

Я добавляю фазу сборки «Копировать файл» к моей цели, и все идет хорошо. Копия установлена ​​в $ (BUILT_PRODUCTS_DIR) как «Абсолютный путь»

Когда я запускаю свое приложение из терминала (используя проект iphonesim), я получаю эту ошибку:

 dyld: Library not loaded: @rpath/OCMock.framework/Versions/A/OCMock

 UIKitApplication:indemnisation[0xb894][26380]     Referenced from: /Users/Admin/Library/Application Support/iPhone Simulator/User/Applications/CD5729B5-A674-49B2-91F6-AD398094B6F8/indemINT.app/indemINT

Что я не понимаю, так это то, что фаза сборки копии просто копирует файлы инфраструктуры в тот же каталог, что и приложение.

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

Я также пытался добавить OCMock.framework в следующие каталоги (безуспешно):

 /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.0.sdk/System/Library

 /Library/Frameworks

 /Users/Admin/Library/Application Support/iPhone Simulator/User/Applications/CD5729B5-A674-49B2-91F6-AD398094B6F8

Заранее спасибо, Винсент.

Ответы [ 3 ]

8 голосов
/ 18 декабря 2011

У меня точно такая же ошибка в Xcode 4.2 (4D199) на Lion. Я перетащил / бросил папку OCMock.framework в свой проект и установил флажок «копировать файлы». Я увидел приведенные выше ответы и понял, что забыл добавить фазу сборки «Копирование файлов», чтобы переместить фреймворк на место. Я добавил один и перетащил его сразу после фазы компиляции файлов и попытался снова запустить мои тесты. Я не мог заставить его работать, пока я не изменил место назначения в фазе «Копирование файлов» на «Каталог продуктов». Использование «Frameworks» или «Shared Frameworks» не сработало.

2 голосов
/ 18 марта 2010

iPhone не поддерживает традиционные платформы Mac OS X. В то время как iPhone использует папки, оканчивающиеся на «.framework», эти папки структурированы иначе, чем типичные платформы Mac OS X. В частности, фреймворкам iPhone разрешено использовать только статические библиотеки, тогда как типичные фреймворки Mac OS X загружаются динамически. То, что сообщение пришло от dyld, указывает на то, что вы используете общую библиотеку; однако приложения, ориентированные на iPhone, могут быть связаны только статически.

0 голосов
/ 24 февраля 2012

OCMock распространяется как фреймворк, и iPhone не позволяет вам создавать собственные произвольные фреймворки (есть веские причины делать это на устройстве с 128 МБ ОЗУ и без подкачки).

Решение, которое я вижу во многих местах в Интернете, состоит в том, чтобы поместить OCMock.framework в / Library / Frameworks или где-либо еще в стандартные пути поиска фреймворка. Это не очень хорошее решение: ваша система сборки теперь зависит от состояния вашей конкретной машины. Не хорошо.

Другим вариантом будет добавление источника для OCMock к вашей цели модульного тестирования. Это будет работать, но не обязательно, поскольку ваши тесты никогда не будут выполняться на iPhone 2, так зачем же создавать их для ARM? Исполняемые файлы, созданные для симулятора iPhone, являющиеся двоичными файлами Mac OS X, могут отлично связываться с динамическими библиотеками. Мы можем использовать это в наших интересах.

Ниже следует то, что я считаю лучшим способом заставить OCMock работать с проектами iPhone:

Сначала добавьте OCMock.framework в свой проект. Убедитесь, что он добавлен к вашей цели модульных тестов, а не к вашему приложению.

Затем добавьте фазу «Копирование файлов» в цель «Юнит-тесты». Настройте это так:

Назначение: Абсолютный Путь Полный путь: $ (BUILT_PRODUCTS_DIR)

Теперь перетащите OCMock.framework на новую фазу копирования файлов, чтобы добавить его в список файлов для копирования.

Наконец, перетащите фазу Copy Files, которую я переименовал в «Copy OCMock», между фазами Compile Sources и Link Binary With Libraries.

Вот и все! Запустите (и я имею в виду под сборкой) ваши тесты, и все должно работать правильно.

...