框架一直在错误的地方搜索 - 如何使用install_name_tool?

时间:2014-08-21 03:41:59

标签: xcode macos cocoa

我正在尝试添加OPN框架以添加对从Opticon手持扫描仪设备导入批次的支持。我将框架添加到项目中

enter image description here

在复制构建阶段添加了

enter image description here

并添加了运行路径搜索路径

enter image description here

我最初得到的完整错误就是这个错误:

dyld: Library not loaded: /Users/[original developer of framework]/Development/Mac OPN API/trunk/Sources/opn_api/build/OPN API.build/Release/OPN.build/Objects-normal/i386/OPN
Referenced from: /Volumes/Hard Disk Drive/users/[My name]/Library/Developer/Xcode/DerivedData/barcode-test2-dvksadjkbyeilghbcdcgfqwrvwcb/Build/Products/Debug/barcode-test2.app/Contents/MacOS/barcode-test2
Reason: image not found

我认为我正在获得开发人员硬盘的本地路径,因为这可能是偶然留下的,并且是它在最终失败之前尝试解决的最后一条路径。

当我检查框架是否被复制到正确的目录时,我发现我确实将它复制到了Frameworks文件夹中。

当我使用otool检查路径时,我看不到任何地方的正确路径:

  

My-MacBook:MacOS me $ otool条码-test2 -L   条形码测试2:     / Users / [Original developer] / Development / Mac OPN API / trunk / Sources / opn_api / build / OPN API.build/Release/OPN.build/Objects-normal/i386/OPN(兼容版本0.0.0,当前版本0.0 .0)     /System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa(兼容版本1.0.0,当前版本19.0.0)     /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation(兼容版本300.0.0,当前版本945.18.0)     /usr/lib/libobjc.A.dylib(兼容性版本1.0.0,当前版本228.0.0)
    /usr/lib/libSystem.B.dylib(兼容版本1.0.0,当前版本169.3.0)     /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit(兼容版本45.0.0,当前版本1187.39.0)     /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation(兼容版本150.0.0,当前版本744.19.0)

OPN二进制文件上的

otool:

  

My-MacBook:OPN.framework me $ otool -L OPN   OPN(架构i386):       / Users / [Original Developer] / Development / Mac OPN API / trunk / Sources / opn_api / build / OPN API.build/Release/OPN.build/Objects-normal/i386/OPN(兼容版本0.0.0,当前版本0.0 .0)      /System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa(兼容版本1.0.0,当前版本11.0.0)      /System/Library/Frameworks/IOKit.framework/Versions/A/IOKit(兼容版本1.0.0,当前版本275.0.0)      /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation(兼容版本150.0.0,当前版本368.35.0)      /System/Library/Frameworks/Carbon.framework/Versions/A/Carbon(兼容版本2.0.0,当前版本128.0.0)      /usr/lib/libstdc++.6.dylib(兼容版本7.0.0,当前版本7.4.0)      /usr/lib/libgcc_s.1.dylib(兼容版本1.0.0,当前版本1.0.0)      /usr/lib/libSystem.B.dylib(兼容性版本1.0.0,当前版本88.3.11)      /System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices(兼容版本1.0.0,当前版本18.0.0)   OPN(架构ppc):      / Users / [Original Developer] / Development / Mac OPN API / trunk / Sources / opn_api / build / OPN API.build/Release/OPN.build/Objects-normal/ppc/OPN(兼容版本0.0.0,当前版本0.0 .0)      /System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa(兼容版本1.0.0,当前版本11.0.0)      /System/Library/Frameworks/IOKit.framework/Versions/A/IOKit(兼容版本1.0.0,当前版本275.0.0)      /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation(兼容版本150.0.0,当前版本368.35.0)      /System/Library/Frameworks/Carbon.framework/Versions/A/Carbon(兼容版本2.0.0,当前版本128.0.0)      /usr/lib/libstdc++.6.dylib(兼容版本7.0.0,当前版本7.4.0)      /usr/lib/libgcc_s.1.dylib(兼容版本1.0.0,当前版本1.0.0)      /usr/lib/libSystem.B.dylib(兼容性版本1.0.0,当前版本88.3.11)      /System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices(兼容版本1.0.0,当前版本18.0.0)

我不应该在这里看到类似@executable_path /../ Frameworks /或其解析版本的内容吗?

我在正在搜索它的地方添加了OPN文件并确定它现在正在构建,但我真的不喜欢在我的Users目录中有一个完整的额外路径来进行此构建。

我已尝试过install_name_tool的许多变体,但每次执行命令时都不会出现错误或确认,当我再次检查otool -L时没有任何变化。

2 个答案:

答案 0 :(得分:2)

@executable_path/../Frameworks添加到OPN框架构建设置的installation Directory中。

enter image description here

答案 1 :(得分:1)

我最终想到了这一点,对于所有可能通过谷歌来到这里的人我也会添加答案。


解决方案

首先,我通过终端前往可执行文件的位置并手动尝试。这是最终奏效的咒语:

install_name_tool -change "/Users/[Original developer]/Development/Mac OPN API/trunk/Sources/opn_api/build/OPN API.build/Release/OPN.build/Objects-normal/i386/OPN" @executable_path/../Frameworks/OPN.Framework/OPN barcode-test2

因此,您想要更改的原始路径需要完全匹配,您需要匹配框架内的二进制文件而不是捆绑包。

当我弄清楚是时候自动完成这个程序了,因为每次我构建项目时它都会有错误的设置。

enter image description here

在Build Phases选项卡中,我使用左上角的+添加了Run Script阶段,然后添加了以下行:

install_name_tool -change "/Users/[Original Developer]/Development/Mac OPN API/trunk/Sources/opn_api/build/OPN API.build/Release/OPN.build/Objects-normal/i386/OPN" @executable_path/../Frameworks/OPN.Framework/OPN "$BUILT_PRODUCTS_DIR/$EXECUTABLE_PATH"

[原始开发者]的真实姓名已更改,因此盲目复制粘贴显然无法工作;)