如何在命令行实用程序中使用动态加载库?

时间:2009-06-02 20:24:31

标签: objective-c cocoa xcode

  

可能重复:
  using frameworks in a command line tool

嗨,

我编写了一个命令行'基础工具',它广泛使用RegexKit.framework。在Xcode中运行时一切正常但如果我编译发布版本并尝试在终端中运行它会收到以下错误:

dyld: Library not loaded: @executable_path/../Frameworks/RegexKit.framework/Versions/A/RegexKit

仔细检查发现RegexKit.framework包与我的可执行文件位于同一目录中......我做了一些研究,我认为由于命令行工具不使用应用程序包,所以没有让Xcode将框架复制到。所以我猜我需要将框架编译为静态库并将其包含在我的代码中......我是对的吗?如果是这样,我该怎么做呢?在终端中我可以做些什么来指向外部框架吗?

任何帮助都会得到很大的帮助,我几天来一直在反对这个问题!

提前致谢,

汤姆

2 个答案:

答案 0 :(得分:0)

所以...我最终做的是用不同的安装目录重新编译框架(在部署部分,在Target信息的Build选项卡下) - 我将它设置为@executable_path。

然后我编译了框架并替换了我的Utilitie项目中的框架,我还更改了复制文件构建阶段,将框架复制到“可执行文件”而不是框架。

好消息是,这解决了我原来的问题 - 但显然框架必须与可执行文件位于同一目录中。

所以这让我不知所措,但我仍然想知道如何静态编译RegexKit.framework!

答案 1 :(得分:0)

您不应该在捆绑包的Executable文件夹中安装框架。它应该在Frameworks文件夹中。您需要在项目中复制框架的“复制文件”阶段,并且需要将“目标”设置为“框架”。 “仅在安装时复制”应取消选中

测试时,应确保执行干净的构建。我通常删除构建文件夹而不是使用Xcode的Clean菜单选项,因为它更快更全面。

另外:您无法静态链接到框架。如果你想静态地链接到某个东西,它需要是一个静态库,所以在这种情况下,你需要使用RegexKit进行破解。请记住,静态库不能包含资源,而作为bundle的Frameworks可以。