3

在过去的两天里,我做了很多研究,仅在这个网站上,我就必须阅读至少 20 个成功回答的问题。没有一个解决方案似乎对我有用。我在我的应用程序中使用了五个框架,并且在我的计算机上运行它没有问题。当我尝试在另一台计算机上运行应用程序时,加载库时出现错误。

Exception Type:  EXC_BREAKPOINT (SIGTRAP)
Exception Codes: 0x0000000000000002, 0x0000000000000000

Application Specific Information:
dyld: launch, loading dependent libraries

Dyld Error Message:
  Library not loaded: /Users/USER/*/Allegro-5.0.framework/Versions/5.0.7/Allegro-5.0
  Referenced from: /Volumes/VOLUME/Pong.app/Contents/MacOS/../Frameworks/AllegroMain-5.0.framework/AllegroMain-5.0
  Reason: image not found

我已经完成了这些步骤:

  • 我有一个复制文件构建阶段,将框架复制到应用程序包中
  • 我使用 install_name_tool 将安装路径更改为 @executable_path/../Frameworks
  • 我已将 @executable_path/../Frameworks 设置为运行路径搜索路径
  • 框架链接到我的程序

看起来 dyld 成功加载了第一个框架(Allegro-5.0),但在尝试加载第二个框架(AllegroMain-5.0)时认为它没有成功

附加信息:

  • 当前运行 OSX 10.7.5
  • Xcode 4.6 版

我的应用程序包的内容文件夹如下所示: Contents Screenshot

我的链接二进制文件与库和复制文件构建阶段: Xcode screenshot

我不确定我对错误原因的看法是正确的。我已经在 allegro.cc 寻求帮助,但基本上被告知他们无法帮助我解决特定于框架的问题。我真的很感激任何帮助解决这个问题!

编辑

我不确定这是否重要,但我想了更多,我的标题搜索路径可能有问题。为了让应用程序运行,我必须为每个框架创建一个新的标头搜索路径。我目前设置了这五个单独的标题搜索路径:

 /Library/Frameworks/Allegro-5.0.framework/Versions/Current/Headers
 /Library/Frameworks/AllegroMain-5.0.framework/Versions/Current/Headers
 /Library/Frameworks/AllegroDialog-5.0.framework/Versions/Current/Headers
 /Library/Frameworks/AllegroFont-5.0.framework/Versions/Current/Headers
 /Library/Frameworks/AllegroTTF-5.0.framework/Versions/Current/Headers

我不确定运行路径搜索路径究竟是如何工作的;它会允许代码找到我的标题吗?错误消息似乎与此问题无关,但这是我想到的另一个想法。

更新 4/14

我所做的事情搞砸了,因为我什至在我的电脑上也开始出现奇怪的行为。我重新安装了框架,但出现了一个新错误。

Exception Type:  EXC_BREAKPOINT (SIGTRAP)
Exception Codes: 0x0000000000000002, 0x0000000000000000

Application Specific Information:
dyld: launch, loading dependent libraries

Dyld Error Message:
  Library not loaded: /opt/local/lib/libfreetype.6.dylib
  Referenced from: /Volumes/VOLUME/Pong.app/Contents/MacOS/../Frameworks/AllegroTTF-5.0.framework/Versions/5.0.10/AllegroTTF-5.0
  Reason: image not found

我的问题现在更笼统了:如果我将 libfreetype 与我的应用程序捆绑在一起,我如何告诉框架在哪里可以找到它?

4

2 回答 2

1

啊哈,我的应用程序现在可以在其他计算机上运行!以下是我为解决我的问题而采取的步骤。

  • 尝试更改框架的 install_name,但我对自己在做什么并没有清楚的了解,所以我一定搞砸了。
  • 重新安装所有框架以获得一个干净的开始。
  • 这一次,我非常小心地更改了每个框架的 install_name 使用

sudo install_name_tool -id [install_name] [path/to/framework]

  • 至此,所有的framework都加载成功了,但是还是尝试在/opt/local/lib下找到自己的依赖
  • 我将依赖项添加到复制文件构建阶段,以便将它们包含在应用程序包中
  • 最后,我再次使用安装名称工具来更改依赖项的搜索路径。

sudo install_name_tool -change [/old/path/to/library] [/new/path/to/library] [path/to/dependent/framework]

例如:对于导致我最初问题中最后一个错误的 libfreetype.6.dylib 依赖项,我使用了以下终端命令。

sudo install_name_tool -change /opt/local/lib/libfreetype.6.dylib @executable_path/../Frameworks/libfreetype.6.dylib /Library/Frameworks/AllegroTTF-5.0.framework/Versions/5.0.10/AllegroTTF-5.0


据我了解,我的大多数问题都是由于我试图盲目地遵循在回答类似但略有不同的问题时给出的终端命令。

实际上,阅读一些文档被证明是弄清楚这一点的关键,而且我现在对框架和库的工作原理的了解比在尝试分发我的应用程序之前要多得多。

谢谢你,堆栈溢出。

于 2013-04-15T01:12:49.307 回答
0

您需要更改交叉引用其他框架的框架中的安装路径。

在这种情况下,您需要将 AllegroMain-5.0.framework 中“/Users/USER/*/Allegro-5.0.framework/Versions/5.0.7/Allegro-5.0”的安装路径更改为“@executable_path/../Frameworks/ Allegro-5.0.framework/Versions/5.0.7/Allegro-5.0”。

我在使用 Qt 打包应用程序构建时遇到了类似的问题。

示例:QtGui.framework 引用 QtCore.framework。

name_tool="/Applications/Xcode.app/Contents/Developer/usr/bin/install_Name_tool"
cd "$APPNAME.app/Contents"

$name_tool -change /Users/USERNAME/QtSDK/Desktop/Qt/474/gcc/lib/QtCore.framework/Versions/4/QtCore @executable_path/../Frameworks/QtCore.framework/Versions/4/QtCore ./Frameworks/QtGui.framework/Versions/4/QtGui
于 2013-04-14T06:26:01.707 回答