gpt4 book ai didi

macos - .dylib 动态链接库可以打包成可执行文件吗?

转载 作者:行者123 更新时间:2023-12-04 10:55:52 42 4
gpt4 key购买 nike

(是的,我明白 dylib 的全部意义在于它动态加载,但我正在尝试创建一个自包含的包。)
我有一个从命令行构建的可执行文件(在 macOS Lion 上,如果重要的话)。我将可执行文件交付给一位 friend ,但他无法运行它,因为他没有安装库。他宁愿不安装库,所以现在我正在尝试创建一个包含原始可执行文件以及所有需要的库的包。
我习惯在 Xcode IDE 中工作,对 make 不是很熟悉和其他命令行构建工具及其选项。 (我按照网络上非常好的说明构建了这个工具。)因此,明确的说明会很有帮助。
谢谢!

最佳答案

您不能直接将 dylib 放入可执行文件中。 (这几乎就是 bundles 的发明目的——但这对你使用命令行工具没有帮助。)
您可以将每个 dylib 重建为静态 ( .a ) 库,在这种情况下,您的可执行文件需要的所有代码都将复制到可执行文件中,并且您无需随它分发任何内容。如果你有库的源代码,这通常很容易——但是如果不知道你是如何构建东西的,很难告诉你要改变什么。
静态链接要记住的一件事是它会影响不同的许可证如何一起使用。特别是,如果您使用的任何库是 LGPL 许可的,静态链接它们会产生动态链接不会的结果。见 this question (以及答案中的链接)了解更多详细信息,但实际上,您不应该相信 Stack Overflow 上的答案以获得有关许可证的法律建议。无论如何,这对于 OP 的“我想构建一个程序并将其提供给我的 friend ”来说可能不是问题,但对于稍后阅读此问题的其他人来说,这可能是问题。
如果静态链接不可能或不可取,您需要做的就是将可执行文件和 dylib 打包在一起,然后将它们放到您 friend 的机器上。由于他显然不想运行安装程序,这意味着 tarball 或 ZIP 文件。
唯一棘手的部分是确保可执行文件知道在哪里可以找到 dylib。除非每个 dylib 都在 dyld 搜索路径中(有关更多详细信息,请参阅 dyld 的联机帮助页,但如果您不想安装任何东西,它不会对您有帮助),或者在它所在的完全相同的位置链接它时,运行可执行文件将失败,并显示来自 dyld 的“未找到图像”错误。 .
幸运的是,“完全相同的地方”可能意味着像 @executable_path/libfoo.dylib 这样的神奇路径。 , 表示“与 myexe 在同一目录中” ”,而不是像 /opt/local/lib/libfoo.dylib 这样的绝对路径或者像 ../../foo/build/Release/libfoo.dylib 这样的相对路径. (请注意,正常的相对路径是相对于当前工作目录,而不是可执行文件或包目录。)
您可以通过执行以下操作查看 myexe 正在查找的位置:

$ otool -L myexe
任何未查看的内容 @executable_path (除了 /lib/usr/lib 中的内容,它们是操作系统的一部分,不需要分发),您可以像这样修复它:
$ install_name_tool -change ../../../mydl/build/Release/libmydl.dylib @executable_path/libmydl.dylib myexe
现在,您只需要复制 myexe 旁边的所有 dylib。 ,将其解压,然后将其交给您的 friend ,他只需解压并运行 exe。

关于macos - .dylib 动态链接库可以打包成可执行文件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9098926/

42 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com