我可以在我的可执行文件中包含dylib吗?

时间:2012-02-01 15:55:17

标签: macos build dylib

(是的,我明白dylib的重点在于动态加载,但我正在尝试创建一个自包含的包。)

我有一个我从命令行构建的可执行文件 - 在OS-X / Lion上,如果重要的话。我将可执行文件发送给了朋友,但他无法运行它,因为他没有安装库。他宁愿安装库,所以现在我正在尝试创建一个包含原始可执行文件和所有必需库的包。

我习惯在XCode(IDE)中工作,对make和命令行构建工具及其选项不是很熟悉。 (我按照网上非常好的指示构建了这个工具。)因此,明确的指示会有所帮助。

谢谢!

2 个答案:

答案 0 :(得分:12)

您无法直接将dylib放入可执行文件中。 (这就是发明捆绑包的原因 - 但这对命令行工具没有帮助。)

您可以将每个dylib重建为静态(.a)库,在这种情况下,您的可执行文件所需的所有代码都将被复制到可执行文件中,并且您不需要使用它来分发任何内容。如果您已经获得了库的来源,这通常很容易 - 但是如果不确切知道您是如何构建的,那么很难告诉您要改变什么。

静态链接要记住的一件事是它会影响不同许可证的组合方式。特别是,如果您使用的任何库是LGPL许可的,则静态链接它们会产生动态链接不具备的后果。有关更多详细信息,请参阅this question(以及答案中的链接),但实际上,您不应该信任Stack Overflow上有关许可证的法律建议的答案。无论如何,这可能不是OP的问题“我想建立一个程序并将其交给我的朋友”,但是对于其他人稍后阅读这个问题,它可能是。

如果静态链接不可行或不可取,您需要做的就是将可执行文件和dylib打包在一起并将它们放到朋友的机器上。由于他显然不想运行安装程序,这意味着tarball或zipfile。

唯一棘手的部分是确保exe知道在哪里找到dylib。除非每个dylib都在dyld搜索路径中(有关更多详细信息,请参阅dyld的联机帮助页,但如果您不想安装任何内容,它将不会帮助您),或者在您完全相同的位置链接它,运行可执行文件将失败,dyld中出现“找不到图像”错误。

幸运的是,“完全相同的地方”可能意味着像“@ executable_path / libfoo.dylib”这样的神奇路径,意思是“与myexe在同一目录中”,而不是像“/ opt / local / lib /”这样的绝对路径libfoo.dylib“或相对路径,如”../../foo/build/Release/libfoo.dylib“。 (请注意,正常的相对路径是相对于当前工作目录的,而不是可执行文件或bundle目录。)

您可以通过以下方式查看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,将其打包,并将其交给您的朋友,他就可以解压缩并运行exe。

答案 1 :(得分:-1)

在Mac OS X上,dylib通常存储在“/ usr / local /”中。默认情况下,所有应用程序都在“/ usr / local /".

中查找所有必需的dylib

选项1是将dylib放在您的朋友机器中“/ usr / local /".

选项2,将dylib放在与可执行文件相同的目录中。

选项3,修复应用程序或dylib中的路径。 XCode dylib looking in /usr/lib会很有用。您可以使用此选项将dylib打包到您选择的位置,即应用程序包内部和外部。