这是一种丑陋的,但我被困住了,所以它是这样的:
我正在编写一个使用opencv(highgui和其他部分)并最终由ffmpeg(libavfilter)加载的动态库(此后称为'mylib.dylib')。该库编译得很好。但是当我尝试从 ffmpeg 中 dlopen() dylib 时,我收到以下错误:
mylib.dylib: dlopen(mylib.dylib, 2): Library not loaded: /usr/local/lib/libpng15.15.dylib
Referenced from: /usr/local/lib/libopencv_highgui.2.3.dylib
Reason: Incompatible library version: libopencv_highgui.2.3.dylib requires version 17.0.0 or later, but libpng15.15.dylib provides version 16.0.0
但是,当我运行otool -L /usr/local/lib/libpng15.15.dylib时, 我得到以下信息:
/usr/local/lib/libpng15.15.dylib:
/usr/local/lib/libpng15.15.dylib (compatibility version 20.0.0, current version 20.0.0)
/usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.0.0)
上次我查了一下,20.0.0 比 17.0.0 晚,这是 highgui 说的它需要的。
我想这可能是一个架构问题(我在运行 Lion 的 Mac 上,所以我遇到了很多关于 i386/x86_64 的问题),但是在所有库上运行“文件”显示一切(highgui、libpng、 mylib) 是Mach-O 64 位动态链接共享库 x86_64
我想也许有一些其他版本的 libpng 隐藏在我的系统某处,但 dlopen 错误特别指向 /usr/local/lib/libpng15.15.dylib
很明显,我在这里遗漏了一些东西——诚然,我不是这些动态库如何链接的专家。因此,如果我忘记包含一些相关信息,请原谅。
更新 我忘了提到——当我通过 XCode 运行 ffmpeg(没有 dlopen 错误)时,lib 工作正常,这让我相信它可能与 XCode 设置的环境变量有关,而我不是。
谢谢!
解决方案 1. 别傻我使用的是 MAMP,因为我通过 php 脚本调用 ffmpeg,所以它使用了自己的一组 dylib,其中(惊喜)包括 libpng 16.0.0