如何使用依赖库分发Mac OS X?

Ada*_*eld 15 macos software-distribution dynamic-linking dyld

我有一个程序(特别是我的SO DevDays倒计时应用挑战的入口),它依赖于几个动态库,即libSDL,libSDL_ttf等.我/opt/local/lib通过MacPorts 安装了这些库,许多人不会安装这些库(有些人可能已经安装了这些库,但是没有安装它们).

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

nal*_*all 13

对此的基本方法是将它们发送到.app包中.然后,您将修改链接器查找共享库以包含此位置的位置.

步骤是:

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

  2. 编辑构建配置设置"Runpath搜索路径"以包括 @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.


Die*_*Epp 6

如你所说,你没有使用Xcode,所以有点困难.以下是我的偏好顺序中的选项:

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

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

  3. 与SDL静态链接.在Makefile中,您必须列出静态库的路径而不是使用-l标志,例如,您运行"ld blah blah /opt/local/lib/libsdl.a".我不知道告诉-l更喜欢静态而不是共享库,相信我,我已经看过了.

  • 4. 使用上面的选项 2,将框架放入 .app 包(.dmg 文件)中,并使用 install_name_tool 更改可执行文件所需的路径。以下是如何使用 install_name_tool 的一些示例:http://qt-project.org/doc/qt-4.8/deployment-mac.html。Dietrich,您能否将其纳入您的答案中? (2认同)