我想在 OSX 上部署一个 .dylib,它是用 Delphi 创建的。这个 .dylib 应该可以被第三方应用程序加载。
这似乎是一个重复的问题,但经过大量搜索,我找不到答案。与此问题相同:https ://forums.embarcadero.com/thread.jspa?messageID=592417
问题是 .dylib 需要,但从第三方应用程序运行时libcgunwind.1.0.dylib
找不到它。作为测试,我尝试复制到,并且有效。当 OSX 找不到 .dylib 时,它总是会在 .dylib 中搜索。不幸的是,我不想将其作为最终解决方案,因为它需要提升权限,并且似乎是处理简单问题的一种严厉方式。libcgunwind.1.0.dylib
usr/lib
usr/lib
仔细检查一下,我曾经otool
检查过我的 .dylib,它给了我以下路径:@rpath/libcgunwind.1.0.dylib
.
@rpath
问题是,当您的 .dylib 由第三方应用程序运行时,没有考虑将在 中列出哪些路径。为此,应用程序必须始终提供指向libcgunwind.1.0.dylib
.
显而易见的解决方案是使用install_name_tool
替换@rpath
为@loader_path
。如果我的逻辑是正确的,这应该会导致我的 .dylib 总是 find 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
, 似乎对编译器来说是隐含的,而不是我可以调整的。
我并不是说这是解决问题的正确方法,这些只是我尝试过的最新方法。如果您能想出不同的解决问题的方法,请分享您的想法!