使框架保密,同时忽略install_name_tool

时间:2013-02-18 01:06:54

标签: xcode dylib install-name-tool libgphoto2

我使用GPhoto2 Framework编写了一个简单的应用程序,只要框架位于最初编译的位置,这就可以工作。我想在app bundle中移动它,所以它不需要单独安装,所以我需要让它相对于这个主要的可执行文件工作。

不幸的是,框架不是Xcode项目。它使用脚本来构建,所以我不能简单地更改安装目录构建设置,这是我在搜索答案时经常看到的解决方案。作为Xcode和Mac编程的新手,我不知道如何将框架转换为Xcode项目。

我遇到的另一个建议是使用install_name_tool来更新库ID和依赖项,用表格" @executable_path /../ Frameworks / GPhoto2.framework"替换绝对路径。该框架不是单个二进制文件,但包含许多.dylib和.so库,但更新所有这些只是成功的一半。

我已将Xcode设置为在构建时将框架复制到应用程序包中。然后,如果我从最初编译的位置删除框架,则应用程序无法加载,OS X生成的报告表示无法再找到libgphoto2库。

如果我然后使用install_name_tool更新应用程序包内的所有框架库中的引用,以及应用程序二进制文件本身,那么应用程序将加载但无法找到任何连接的相机。使用otool我能够验证所有引用都已正确更改。

但是,如果我将框架的副本替换为其原始位置,那么它将再次正常工作,识别连接的摄像机,无论该框架是使用相对位置还是绝对位置。显然,尽管装载,它仍然在看这个位置。我甚至尝试从原始位置依次从框架中删除每个库文件,以查看问题是否只是这些问题的依赖性结果,但无论哪个缺失,应用程序都无法工作。

顺便说一句,如果我使用框架的更新版本构建应用程序,则无法说它无法找到库" @executable_path /../ Frameworks / GPhoto2.framework / prefix / lib / libgphoto2.2。 dylib"

我做错了什么或者错过了一个步骤,或者我在Xcode外部创建的框架是不可能的?

1 个答案:

答案 0 :(得分:0)

如果有人遇到这个未来,我的问题的答案是我没有做错任何事。问题是.so文件是由libtool有限公司加载的,因为它需要绝对路径,所以这些是在构建时设置的。

我修补了文件gphoto2-abilities-list.c和gphoto2-port-info-list.c,以便在运行时将相对库路径与可执行位置组合在一起。因此,我还需要增加FILENAME_MAX常量以允许邮件应用程序从例如桌面运行。但是,这与使用install_name_tool一起允许我在我的应用程序中添加GPhoto2作为框架,而不需要任何外部依赖。

使用install_name_tool之后无法使用框架在XCode中构建我的应用程序的最后一个问题仍然存在,但为此我只使用了原始框架构建,然后在编译后我同时更新了复制框架中的引用因为我更新了主要可执行文件中的那些。