我有一个程序(特别是我的SO DevDays Countdown app challenge条目),它依赖于几个动态库,即libSDL,libSDL_ttf等。我通过MacPorts在/opt/local/lib
下安装了这些库,许多人不会安装这些库(有些可能已经安装了这些库,但没有安装它们。)
如何分发我的程序,以便没有安装这些库的人可以开箱即用?显然我必须分发各种.dylib
文件,但这样做是不够的。动态加载程序仍然会查找安装在我安装的位置的库。有没有办法告诉动态加载器查看可执行文件的当前目录,比如Windows对DLL的作用?人们不应该修改任何环境变量(例如DYLD_LIBRARY_PATH
),因为我再次希望这可以开箱即用。
答案 0 :(得分:13)
基本方法是将它们放在.app包中。然后,您将修改链接器查找共享库的位置以包含此位置。
步骤如下:
为您的目标创建一个新的复制文件构建阶段,将这些文件复制到.app软件包的Frameworks目录中。
编辑构建配置设置“运行路径搜索路径”以包含@executable_path/../Frameworks
如果您使用这些更改构建可执行文件然后查看,您应该会发现dylib存在于Foo.app/Contents/Framework
目录中,并且正在运行otool -L Foo.app/Contents/MacOS/Foo
应该为这些dylib生成前缀为@rpath的条目。< / p>
一般情况下,@loader_path
比@executable_path
更受欢迎,因为它
允许嵌入式框架在可执行文件和包中工作,
插件或子框架。唯一的缺点是@loader_path
要求10.4或更高版本。如果您使用的是10.5或更新,@rpath
甚至是
优于@loader_path
。
答案 1 :(得分:6)
如你所说,你没有使用Xcode,所以有点困难。以下是我的偏好顺序中的选项:
切换到Xcode。使用框架。 SDL库已经作为框架提供,我在应用程序包中看到了一些带有libsdl.framework的商业游戏。
使用框架,但保留您的Makefile。下载SDL库的框架版本(或自己构建),并使用-framework链接器标志与它们链接。使用您的应用程序分发框架或不分发框架,并告诉您的用户将它们放在〜/ Library / Frameworks或/ Library / Frameworks中。我不打扰安装人员。
静态链接SDL。在Makefile中,您必须列出静态库的路径而不是使用-l标志,例如,运行“ld blah blah /opt/local/lib/libsdl.a”。我不知道告诉-l更喜欢静态而不是共享库,相信我,我看了。
答案 2 :(得分:3)
静态链接库。