dyld: Библиотеката не е заредена - Когато приложението се стартира от командния ред

Сблъсквам се с някои трудности при добавяне на рамка към моя проект, когато стартирам приложение за 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

Благодаря предварително, Винсент.


person user142764    schedule 18.03.2010    source източник


Отговори (3)


Току-що имах същата грешка в Xcode 4.2 (4D199) на Lion. Влачих/пуснах папката OCMock.framework в моя проект и поставих отметка в квадратчето „копиране на файлове“. Видях горните отговори и разбрах, че съм пропуснал да добавя фаза на изграждане на „Копиране на файлове“, за да преместя рамката на място. Добавих един и го плъзнах веднага след фазата на компилиране на файлове и се опитах да стартирам тестовете си отново. Не можах да го накарам да работи, докато не промених дестинацията във фазата „Копиране на файлове“ на „Директория с продукти“. Използването на „Frameworks“ или „Shared Frameworks“ не работи.

person Cliff    schedule 18.12.2011

IPhone не поддържа традиционни рамки на Mac OS X. Въпреки че iPhone използва папки, които завършват на ".framework", тези папки са структурирани по различен начин от типичните рамки на Mac OS X. Най-вече, рамките на iPhone имат право да използват само статични библиотеки, докато типичните рамки на Mac OS X се зареждат динамично. Това, че съобщението идва от dyld, показва, че използвате споделена библиотека; обаче, приложенията, насочени към iPhone, могат да бъдат само статично свързани.

person Michael Aaron Safyan    schedule 18.03.2010
comment
И имайте предвид, че ако искате да го направите за OSX, вашата дестинация трябва да бъде зададена на «Framework», без подпът, във вашата фаза на компилиране «Copy file», така че рамката да бъде включена в приложението ви (като я има в същата папка тъй като приложението не е решение). - person Macmade; 18.03.2010

OCMock се разпространява като рамка и iPhone не ви позволява да създавате свои собствени произволни рамки (има основателни причини да направите това на устройство само със 128MB RAM и без суап).

Решението, което виждам на много места в мрежата, е да поставите OCMock.framework в /Library/Frameworks или където и да е другаде в стандартните пътища за търсене на рамка. Това не е много добро решение: вашата система за изграждане вече зависи от състоянието на вашата конкретна машина. Не е добре.

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

Това, което следва, е това, което според мен е най-добрият начин да накарате OCMock да работи с iPhone проекти:

Първо добавете OCMock.framework към вашия проект. Уверете се, че се добавя към целта на Unit Tests, а не към вашето приложение.

След това добавете фаза за копиране на файлове към вашата цел Unit Tests. Настройте го така:

Дестинация: Абсолютен път Пълен път: $(BUILT_PRODUCTS_DIR)

Сега плъзнете OCMock.framework върху вашата нова фаза за копиране на файлове, за да го добавите към списъка с файлове за копиране.

Накрая плъзнете фазата Copy Files, която преименувах на „Copy OCMock“, между фазите Compile Sources и Link Binary With Libraries.

Това е! Изпълнете (и под изпълнение имам предвид компилиране) вашите тестове и всичко трябва да работи правилно.

person Arunjack    schedule 24.02.2012