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

Oli*_*lie 7 macos build dylib

(是的,我理解dylib的重点是动态加载,但我正在尝试创建一个自包含的包.)

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

我习惯于在XCode(IDE)中工作,并且不熟悉make和命令行构建工具及其选项.(我根据网上的非常好的指示构建了这个工具.)因此,明确的指示会很有帮助.

谢谢!

aba*_*ert 12

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

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

静态链接要记住的一件事是它会影响不同许可证的组合方式.特别是,如果您使用的任何库都是LGPL许可的,那么静态链接它们会产生动态链接不具备的后果.有关详细信息,请参阅此问题(以及答案中的链接),但实际上,您不应该信任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
Run Code Online (Sandbox Code Playgroud)

任何没有查看@executable_path的东西(除了/ lib和/ usr/lib中的东西,这是操作系统的一部分,不需要分发),你可以像这样解决:

install_name_tool -change ../../../mydl/build/Release/libmydl.dylib @executable_path/libmydl.dylib myexe
Run Code Online (Sandbox Code Playgroud)

现在,你只需要将所有那些dylib复制到myexe旁边,将其tar起来,然后将它交给你的朋友,他就可以解压缩并运行exe.