我想在OSX上部署一个使用Delphi创建的.dylib文件,应该能够被第三方应用程序加载。这似乎是一个重复的问题,但是经过大量搜索,我找不到答案。问题在于.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
: 文件排序不正确(本地重定位项位置不正确):libTest.dylib
我查找了这个错误信息,但是没有找到任何相关的信息。我猜测install_name_tool
需要在gcc或者llvm编译的.dylib库中找到一些特定的惯例,而Delphi的编译器并没有提供这些惯例。
我在Delphi的编译器dccosx
中进行了一些调查,并检查了Delphi发送给它的命令行参数,但是我没有找到任何有用的选项。这种使用libcgunwind.1.0.dylib
的方式似乎是隐含在编译器中的,而且我无法进行调整。
我并不是在建议这是解决问题的正确方法,这只是我尝试过的最新方法。如果你能想出其他解决问题的方法,请分享你的想法!
"D:\Dev\OSXPatcher.exe" "$(OUTPUTPATH)"
。然后补丁会自动进行。 - Sebastian Z