【问题标题】:OS X dlopen can't find framework - Image Not FoundOS X dlopen 找不到框架 - 找不到图像
【发布时间】:2014-09-07 20:27:36
【问题描述】:

我正在尝试将 Google Breakpad(一些外部框架)支持添加到我的应用程序中。我已经完成了所有必需的步骤,但是当我尝试使用 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 文件)中。

这是 MyApp 文件上的 otool -L(注意 @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)

有人知道吗?

【问题讨论】:

  • 您是如何构建 MyApp 并包含框架的?以及为什么以及如何使用 dlopen?
  • 我包含了框架。它被添加到 Frameworks 文件夹和将其复制到 Frameworks 的 Copy Files 阶段。另外,我可以在 /Contents/Frameworks/Breakpad.framework 中找到它
  • 我正在使用 dlopen,因为我的应用程序有一个加载它的包装器。

标签: macos dlopen google-breakpad


【解决方案1】:

按照以下步骤,它可能会起作用:

  1. 转到Target,然后按Build Phase
  2. 页面左上角有+符号,请按此符号。
  3. 按新建复制文件构建阶段
  4. 展开复制文件,然后将您的框架拖放到此部分。
  5. 将 Destination 更改为 frameworks

希望它会起作用

【讨论】:

  • 我已经说过我添加了一个复制文件阶段来复制框架。
【解决方案2】:

好吧,事实证明,在使用动态库和为 OS X 10.6 编译时,这是一个问题。 @executable_path 在动态加载后没有得到更新,因此 LOADED 二进制文件正在寻找其相对于 LOADING 二进制文件的依赖项。

我最终重新编译了我的框架 Breakpad,并使用 @loader_path 而不是 @executable_path,现在一切正常。

更多信息在这里: dylib @executable_path path issue in a plug-in bundle

【讨论】:

    猜你喜欢
    • 2014-09-19
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 2016-02-05
    • 2012-10-31
    • 2023-03-05
    • 2016-08-27
    • 2016-02-04
    相关资源
    最近更新 更多