You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让同一目录下的两个dylib在Mac系统中完成链接?

解决Mac下同一目录中动态库的链接问题

这问题我之前帮不少开发者排查过,Mac的动态库加载机制确实容易在自定义安装路径上踩坑。核心问题出在**动态库的安装路径(install_name)和运行时搜索路径(rpath)**的配置上,下面一步步帮你搞定:

第一步:检查当前动态库的引用路径

先确认你的自定义dylib(比如叫YourCustomLib.dylib)是怎么引用libusb的。打开终端,运行:

otool -L YourCustomLib.dylib

输出里你大概率会看到libusb的路径是/usr/local/lib/libusb.dylib——这就是问题所在:你的自定义库硬编码了去系统目录找libusb,而不是当前目录。

第二步:修改自定义库对libusb的引用路径

用install_name_tool把自定义库中libusb的引用改成相对路径变量@rpath:

install_name_tool -change /usr/local/lib/libusb.dylib @rpath/libusb.dylib YourCustomLib.dylib

@rpath是Mac动态库的一个特殊变量,代表运行时会去搜索的路径集合。

第三步:给自定义库添加当前目录的搜索路径

接下来让你的自定义库知道,要去它自身所在的目录找依赖的libusb,添加@loader_path作为rpath:

install_name_tool -add_rpath @loader_path/ YourCustomLib.dylib

@loader_path指向当前dylib所在的目录,这样运行时它就会在同一目录下找libusb.dylib了。

第四步:确保主程序也配置了正确的rpath

如果你的主程序(调用自定义dylib的程序)和这两个dylib在同一目录,还要给主程序添加rpath,让它能找到你的自定义dylib:

  • 如果你用Xcode编译主程序:在Build Settings里找到Runpath Search Paths,添加@executable_path/(@executable_path指主程序所在目录)
  • 如果你用命令行编译:编译时加上参数-Wl,-rpath,@executable_path/

额外优化:编译libusb时就配置正确的install_name

下次编译libusb的时候,可以直接指定它的install_name为@rpath/libusb.dylib,这样后续引用它的库就不用再修改路径了,编译命令大概是:

./configure --prefix=/tmp/libusb-install
make install_name=@rpath/libusb.dylib install

验证修改是否生效

修改完成后,再用otool -L YourCustomLib.dylib检查,应该能看到libusb的引用变成@rpath/libusb.dylib;再运行:

otool -l YourCustomLib.dylib | grep -A 5 LC_RPATH

输出里应该包含@loader_path/这条rpath配置。

做完这些,把两个dylib放在同一目录下,主程序就能正常加载它们了,不用再把libusb移到/usr/local/lib啦。

内容的提问来源于stack exchange,提问作者GrixM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:52:50