使框架私有,同时忽略install_name_tool



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

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

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

我已经设置了Xcode,在它构建框架时将其复制到应用程序包中。然后,如果我从最初编译的位置删除框架,应用程序将无法加载,OS X生成的报告显示,无法再找到libgphoto2库,这是意料之中的事。

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

但是,如果我将框架的副本替换到其原始位置,它就会再次正常工作,识别连接的相机,无论该框架使用的是相对位置还是绝对位置。很明显,尽管装载了货物,但它仍在寻找这个位置。我甚至试着从框架的原始位置依次删除每个单独的库文件,看看问题是否只是其中一个依赖项的结果,但无论缺少哪一个,应用程序都不会工作。

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

我是做错了什么,还是错过了一步,或者我试图做的事情对于Xcode之外创建的框架来说是不可能的?

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

我修补了gphoto2能力列表.c和gphoto2端口信息列表.c文件,以便在运行时将相对库路径与可执行文件位置结合起来。因此,我还需要增加FILENAME_MAX常量,以允许邮件应用程序从桌面运行。但这一点,再加上install_name_tool的使用,使我能够在应用程序中添加GPhoto2作为框架,而不需要任何外部依赖关系。

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

相关内容

最新更新