16

我有一个程序(特别是我的SO DevDays Countdown 应用挑战条目),它依赖于几个动态库,即 libSDL、libSDL_ttf 等。我/opt/local/lib通过 MacPorts 安装了这些库,很多人不会安装这些库(有些人可能安装了它们,但不是在那个位置)。

如何分发我的程序,以便没有安装这些库的人可以开箱即用地运行它?显然我必须分发各种.dylib文件,但这样做是不够的。动态加载器仍会查找安装在我安装它们的位置的库。有没有办法告诉动态加载器查看可执行文件的当前目录,就像 Windows 对 DLL 所做的那样?人们不应该修改任何环境变量(例如DYLD_LIBRARY_PATH),因为我希望它能够开箱即用。

4

3 回答 3

13

基本的方法是将它们放在 .app 包中。然后,您将修改链接器查找共享库的位置以包含它。

步骤是:

  1. 为您的目标创建一个新的复制文件构建阶段,将这些文件复制到 .app 包的 Frameworks 目录中。

  2. 编辑构建配置设置“运行路径搜索路径”以包括@executable_path/../Frameworks

如果您使用这些更改构建可执行文件然后查看,您应该会发现Foo.app/Contents/Framework目录中存在 dylib,并且运行otool -L Foo.app/Contents/MacOS/Foo应该为这些 dylib 生成以 @rpath 为前缀的条目。

从这个Cocoabuilder 帖子

一般来说,@loader_path优先于@executable_path,因为它
允许嵌入式框架在可执行文件和包、
插件或子框架中工作。唯一的缺点是@loader_path
需要 10.4 或更高版本。如果您使用的是 10.5 或更高版本,@rpath甚至
@loader_path.

于 2009-09-27T03:40:46.860 回答
6

正如您提到的,您没有使用 Xcode,所以这有点困难。以下是按我的偏好顺序排列的选项:

  1. 切换到 Xcode。使用框架。SDL 库已经作为框架提供,而且我已经看到了不止几个在应用程序包中带有 libsdl.framework 的商业游戏。

  2. 使用框架,但保留您的 Makefile。下载您的 SDL 库的框架版本(或自己构建它们),并使用 -framework 链接器标志与它们链接。将框架与您的应用一起分发或不分发,并告诉您的用户将它们放在 ~/Library/Frameworks 或 /Library/Frameworks 中。我不会为此烦恼安装程序。

  3. Statically link against SDL. In the Makefile, you'll have to list the path of the static libraries rather than use the -l flag, e.g., you run "ld blah blah /opt/local/lib/libsdl.a". There is no way that I know to tell -l to prefer static over shared libraries, and believe me, I've looked.

于 2009-09-27T04:10:08.770 回答
3

静态链接库。

于 2009-09-27T03:17:06.313 回答