2010-08-25 114 views
1

我看了一些相关的问题,似乎无法找到自己的解决方案。Xcode,建设和dylibs

基本上我在我的Xcode项目中使用libmp3lame.dylib。 lame的安装过程会生成.dylib并将其放在usr/local/lib中,并让Xcode生成并运行项目。我更改了“库搜索路径”以包含上述文件夹。这工作正常。

现在来制作一个发布版本,并且我希望在捆绑包中包含.dylib,以便用户不必忍受安装阶段或类似的任何事情。我创建了目标的复制文件阶段,并将.dylib转储到软件包内容的Frameworks文件夹中。但是,在二进制文件上运行otool显示,不是在软件包内部使用.dylib,编译器已经将它链接到usr/local/lib版本(即使我删除了该版本)。

查看otool输出中的其他结果我有其他框架链接到束内,而不是.dylib。在Xcode中查看这些框架和.dylib的属性,除了文件类型之外,我看不到任何差异。

我的搜索建议我需要使用rpath或类似的,但我不知道在Xcode中应用此位置。

回答

2

我对这个问题的解决方法是做终端以下(我用的Automator,好了,这个自动化):

install_name_tool -id @executable_path/../Frameworks/libmp3lame.0.0.0.dylib ~/path/to/lib/in/app/libmp3lame.0.0.0.dylib 

install_name_tool -change /usr/local/lib/libmp3lame.0.dylib @executable_path/../Frameworks/libmp3lame.0.0.0.dylib ~/path/to/app/Contents/MacOS/AppName 

基本上是从一个交换路径到库中的USR本地lib到捆绑包中的一个。

0

我的技巧是查看构建输出,它如何实际运行ld?

+0

我猜测ld的相关部分是:“-lmp3lame.0.0.0”。 -l是否处理文件名本身的lib部分?否则我很困惑,因为文件名是libmp3lame.0.0.0.dylib。 – Septih 2010-08-25 09:53:28

+0

啊,它的确如此。我认为问题在于它在构建版本中定义的目录(库搜索路径)中寻找libmp3lame.dylib,但复制文件阶段不会将dylib放入该包中直到ld之后。所以新的困境是如何明确地告诉它在那里寻找图书馆,而不是仅仅在几个文件夹中寻找一个。仍然困惑,为什么它连接到usr/local/lib文件夹,当我删除.dylib那里虽然... – Septih 2010-08-25 10:19:45