2014-09-07 3 views
0

Я пытаюсь добавить поддержку Google Breakpad (некоторая внешняя инфраструктура) для моего приложения. Я сделал все необходимые шаги, но когда я пытаюсь загрузить мое приложение с помощью dlopen, я получаю эту ошибку:OS X dlopen не может найти фреймворк - Изображение не найдено

(char *) error = 0x0000000100200175 "dlopen(/Users/user/MyApp.app/Contents/MacOS/MyApp, 1): 
Library not loaded: @executable_path/../Frameworks/Breakpad.framework/Versions/A/Breakpad\n 
Referenced from: /Users/user/MyApp.app/Contents/MacOS/MyApp\n 
Reason: image not found" 

я проверил, и файл Breakpad действительно существует в относительном пути (к файлу MyApp) ,

Вот otool -L на файле MyApp (обратите внимание на @executable_path):

Users-Mac:MacOS user$ otool -L MyApp 
MyApp: 
    /usr/lib/libcurl.4.dylib (compatibility version 6.0.0, current version 6.1.0) 
    /usr/lib/libssl.0.9.8.dylib (compatibility version 0.9.8, current version 0.9.8) 
    /usr/lib/libcrypto.0.9.8.dylib (compatibility version 0.9.8, current version 0.9.8) 
    /usr/lib/libsqlite3.dylib (compatibility version 9.0.0, current version 9.6.0) 
    /System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate (compatibility version 1.0.0, current version 4.0.0) 
    /System/Library/Frameworks/AudioToolbox.framework/Versions/A/AudioToolbox (compatibility version 1.0.0, current version 1.0.0) 
    /System/Library/Frameworks/AudioUnit.framework/Versions/A/AudioUnit (compatibility version 1.0.0, current version 1.0.0) 
    @executable_path/../Frameworks/Breakpad.framework/Versions/A/Breakpad (compatibility version 1.0.0, current version 1.0.0) 
    /System/Library/Frameworks/Carbon.framework/Versions/A/Carbon (compatibility version 2.0.0, current version 152.0.0) 
    /System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa (compatibility version 1.0.0, current version 15.0.0) 
    /System/Library/Frameworks/CoreAudio.framework/Versions/A/CoreAudio (compatibility version 1.0.0, current version 1.0.0) 
    /System/Library/Frameworks/CoreAudioKit.framework/Versions/A/CoreAudioKit (compatibility version 1.0.0, current version 1.0.0) 
    /System/Library/Frameworks/CoreMIDI.framework/Versions/A/CoreMIDI (compatibility version 1.0.0, current version 49.0.0) 
    /System/Library/Frameworks/DiscRecording.framework/Versions/A/DiscRecording (compatibility version 1.0.0, current version 1.0.0) 
    /System/Library/Frameworks/IOKit.framework/Versions/A/IOKit (compatibility version 1.0.0, current version 275.0.0) 
    /System/Library/Frameworks/QuartzCore.framework/Versions/A/QuartzCore (compatibility version 1.2.0, current version 1.6.3) 
    /System/Library/Frameworks/WebKit.framework/Versions/A/WebKit (compatibility version 1.0.0, current version 533.21.1) 
    /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) 
    /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 550.43.0) 
    /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit (compatibility version 45.0.0, current version 1038.36.0) 
    /System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices (compatibility version 1.0.0, current version 38.0.0) 
    /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 227.0.0) 
    /System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices (compatibility version 1.0.0, current version 44.0.0) 
    /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 751.62.0) 

Каждый имеет ключ?

+0

Как вы построили MyApp и включали в себя рамку? и почему и как используется dlopen? – Mark

+0

Я включил фреймворк. Он добавляется в папку «Ракурсы» и на этапе «Копировать файлы», который копирует его в «Ракурсы». Кроме того, я могу найти его в /Contents/Frameworks/Breakpad.framework – Tsury

+0

Я использую dlopen, потому что у моего приложения есть обертка, которая загружает его. – Tsury

ответ

0

Следуйте этим шагам, может работать:

  1. пойти Target затем нажмите Построить Фаза
  2. левой верхней части этой страницы вы найдете + символ, нажмите этот символ ,
  3. нажмите New Copy Files Строить Фаза
  4. расширить копию файла затем перетащить вас рамки и падение в этом разделе.
  5. Изменить Назначения в рамке

Надеется, что это будет работать

+0

Я уже сказал, что я добавил фазу «Копировать файлы», чтобы скопировать фреймворк. – Tsury

0

Ну, оказывается, что это была проблема при использовании динамических библиотек и компиляции для OS X 10.6. @executable_path не обновляется после динамической нагрузки, и, следовательно, двоичный файл LOADED ищет свои зависимости относительно двоичного кода LOADING.

В итоге я перекомпилировал свою фреймворк, Breakpad и использовал @loader_path вместо @executable_path, и теперь все работает отлично.

Больше информации здесь: dylib @executable_path path issue in a plug-in bundle

Смежные вопросы