2013-02-18 45 views
2

我已经使用GPhoto2 Framework编写了一个简单的应用程序,只要框架位于最初编译的位置,它就可以工作。不过,我想将它放入应用程序包中,因此它不需要单独安装,所以我需要使其与此主要可执行文件相关。忽略install_name_tool将框架私有化

不幸的是,框架不是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之外创建的框架吗?

+0

经过进一步检查,我发现了具体的问题。当我通过文件测试来完成我的文件以查看原始框架位置中需要的内容时,我不幸遇到了一个硬编码路径。所以私人框架加载了一些硬编码的依赖关系,给出了一个需求的错误印象。 – Michael 2013-02-18 11:48:30

+0

抱歉,从未意识到的评论不能包含新行。 再次测试原始位置的唯一要求是.so文件,使用字符串我可以确认它们的位置被硬编码到某些库中。 有没有官方的方式能够更新这些?如果没有,是否有可能用二进制编辑器覆盖相对路径的路径,并在这种情况下相对于什么? – Michael 2013-02-18 11:56:08

回答

0

如果有人遇到这个未来,我的问题的答案是我没有做错什么。问题是.so文件正在被libtool ltdl加载,因为它需要绝对路径,所以这些文件是在构建时设置的。

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

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