2

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

不幸的是,该框架不是 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 之外创建的框架做不可能的事情?

4

1 回答 1

0

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

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

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

于 2013-03-31T17:46:03.183 回答