0

这是一种丑陋的,但我被困住了,所以它是这样的:

我正在编写一个使用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

4

2 回答 2

1

仅适用于需要代码的人:

cd  /Applications/MAMP/Library/lib
mv libpng15.15.dylib libpng15.15.dylib_old
ln -s /usr/X11/lib/libpng15.15.dylib .
于 2011-10-03T14:52:26.387 回答
1

在我卸载了所有 MacPorts 并安装了更新版本后,我最近遇到了类似的情况。问题在于 libpng 的版本(1.2 vs 1.4 vs 1.5),而不仅仅是兼容性版本。我已经针对 libpng 1.4(即 libpng14)构建了 OpenCV。我以为我可以只使用 install_name_tool 让它查看 libpng 1.5 (libpng15) ,但这不起作用。我最终针对库的当前版本重建了 OpenCV。效果很好(在我记得之后sudo cmake install)。

(上面的某些版本号可能不正确,但要点是准确的。)

因此,要么你没有构建 OpenCV 时最初拥有的 libpng 版本,要么它是针对 /usr/local/lib 中的 libpng 以外的 libpng 构建的(可能是 /opt/local/lib 中的那个)。如果是这种情况,您需要确保针对您要使用的版本进行构建。如何做到这一点取决于您的构建方法(MacPorts 或 cmake)。我将 cmake 用于 OpenCV,将 MacPorts 用于其他库,这就是为什么两者在我的系统上不同步的原因。

于 2011-08-25T00:10:41.040 回答