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包中.然后,您将修改链接器查找共享库以包含此位置的位置.
步骤是:
为目标创建新的复制文件构建阶段,将这些文件复制到.app包的Frameworks目录中.
编辑构建配置设置"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.
如你所说,你没有使用Xcode,所以有点困难.以下是我的偏好顺序中的选项:
切换到Xcode.使用框架.SDL库已经作为框架提供,我在应用程序包中看到了一些带有libsdl.framework的商业游戏.
使用框架,但保留您的Makefile.下载SDL库的框架版本(或自己构建),并使用-framework链接器标志与它们链接.使用您的应用程序分发框架或不分发框架,并告诉您的用户将它们放在〜/ Library/Frameworks或/ Library/Frameworks中.我不打扰安装程序.
与SDL静态链接.在Makefile中,您必须列出静态库的路径而不是使用-l标志,例如,您运行"ld blah blah /opt/local/lib/libsdl.a".我不知道告诉-l更喜欢静态而不是共享库,相信我,我已经看过了.
| 归档时间: |
|
| 查看次数: |
7831 次 |
| 最近记录: |