Mac下依赖.dylib的Crystal应用最简分发方式咨询
在Mac上分发Crystal应用:依赖.dylib库的最简方案
核心结论
Mac可执行文件的依赖库路径是硬编码的,从你提供的otool -L输出能看到,libgc.1.dylib和libevent-2.1.7.dylib指向的是你本地Homebrew的安装目录。直接把.dylib和可执行文件放同一目录打包不可行,必须修改硬编码的路径才能让其他用户的Mac找到依赖库。
最简分发步骤
复制依赖库到可执行目录
把两个第三方.dylib复制到你的可执行文件(hello)所在的./bin/目录:cp /opt/homebrew/opt/bdw-gc/lib/libgc.1.dylib ./bin/ cp /opt/homebrew/opt/libevent/lib/libevent-2.1.7.dylib ./bin/重写可执行文件的库路径
使用install_name_tool将硬编码的绝对路径改为相对路径(@loader_path代表可执行文件所在的目录):# 修改libgc的路径 install_name_tool -change /opt/homebrew/opt/bdw-gc/lib/libgc.1.dylib @loader_path/libgc.1.dylib ./bin/hello # 修改libevent的路径 install_name_tool -change /opt/homebrew/opt/libevent/lib/libevent-2.1.7.dylib @loader_path/libevent-2.1.7.dylib ./bin/hello验证修改结果
再次运行otool -L ./bin/hello,确认两个第三方库的路径已变为@loader_path/xxx.dylib:./bin/hello: @loader_path/libgc.1.dylib (compatibility version 7.0.0, current version 7.1.0) @loader_path/libevent-2.1.7.dylib (compatibility version 8.0.0, current version 8.1.0) /usr/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1319.0.0)打包分发
将./bin/目录下的hello可执行文件和两个.dylib文件一起打包成ZIP或DMG,其他用户解压后直接运行即可。
补充说明
/usr/lib下的系统库(如libiconv.2.dylib、libSystem.B.dylib)是Mac系统自带的,无需打包,所有Mac用户的系统中都存在。
内容的提问来源于stack exchange,提问作者Serge Hulne
相关产品推荐
相关产品推荐

