我想在OSX上部署一个.dylib,它是用Delphi创建的。此.dylib应可由第三方应用程序加载。
这似乎是一个重复的问题,但经过大量的搜索后,我无法找到答案。问题与此相同:https://forums.embarcadero.com/thread.jspa?messageID=592417
问题是.dylib需要libcgunwind.1.0.dylib
,但在从第三方应用程序运行时无法找到 。作为测试,我尝试将libcgunwind.1.0.dylib
复制到usr/lib
,这很有效。当OSX无法找到.dylib时,它将始终在usr/lib
中搜索。不幸的是,我不想将此作为最终解决方案,因为它需要提升权限,而且似乎是一种处理简单问题的繁琐方式。
仔细检查一下,我使用otool
来检查我的.dylib,它给了我以下路径:@rpath/libcgunwind.1.0.dylib
。
麻烦的是,当你的.dylib由第三方应用程序运行时,没有考虑@rpath
中列出的路径。为此,应用程序始终必须提供libcgunwind.1.0.dylib
的绝对路径。
显而易见的解决方案是使用install_name_tool
将@rpath
替换为@loader_path
。如果我的逻辑是正确的,这应该导致我的.dylib总是找到libcgunwind.1.0.dylib
,只要它们在同一个文件夹中。这是有道理的,因为.dylib应该负责找到自己的依赖。
所以,我尝试了以下命令行:
install_name_tool -change @rpath/libcgunwind.1.0.dylib @loader_path/libcgunwind.1.0.dylib libTest.dylib
并收到此消息:
install_name_tool: file not in an order that can be processed (local relocation entries out of place): libTest.dylib
我做了一些搜索此错误消息,但我还没有找到相关信息。我必须假设install_name_tool
期望在gcc或llvm中构建的.dylib中找到一些特定的约定,并且Delphi的编译器没有提供这些约定。
我在Delphi的编译器dccosx
中进行了一些挖掘,并检查了Delphi发送给它的命令行参数,但我找不到任何有用的选项。这种使用libcgunwind.1.0.dylib
的方式似乎是编译器隐含的,而不是我可以调整的。
我并不是说这是解决问题的正确方法,这些只是我尝试过的最新事情。如果你能想出一个解决问题的不同方法,请分享你的想法!
答案 0 :(得分:3)
install_name_tool似乎要求dylib的某些部分按照某种顺序,如“本地重定位条目”,然后是“符号表”,“本地符号”,...错误消息表示此订单不符合预期
我的建议是你尝试修补dylib文件。我一直都在使用OSX可执行文件,因为我需要告诉他们哪些dylib版本与它们兼容。这修复了Delphi OSX应用程序中的一些错误。 dylib具有与可执行文件非常相似的结构。我的经验是修补这些文件并不像听起来那么复杂。
您可以在此处找到文件结构的说明: https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/MachORuntime/Reference/reference.html
LC_LOAD_DYLIB部分是您需要查看的内容。你应该能够用更长的东西替换dylib名称,因为这部分通常有一些额外的填充。