当我有20.0时,highgui抱怨它需要> = 17.0.0

时间:2011-08-24 23:25:01

标签: c macos opencv dlopen libpng

这是一种丑陋的,但我在这里陷入困境:

我正在编写一个动态库(以下称为“mylib.dylib”),它使用opencv(highgui和其他部分)并最终由ffmpeg(libavfilter)加载。图书馆编译得很好。但是当我尝试从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所说的。

我想也许这是一个架构问题(我在Mac上运行Lion,所以我在i386 / x86_64上遇到了很多问题),但是在所有库上运行'file'都发现了一切(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,它使用了自己的dylibs集,其中包括libpng 16.0.0(意外惊喜)

2 个答案:

答案 0 :(得分: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构建的(就像/ opt / local / lib中的那个) )。如果是这种情况,您需要确保构建您想要使用的版本。如何做到这取决于你的构建方法(MacPorts或cmake)。我使用cmake for OpenCV和MacPorts用于其他库,这就是为什么两者在我的系统上不同步。

答案 1 :(得分:1)

仅限那些需要代码的人:

cd  /Applications/MAMP/Library/lib
mv libpng15.15.dylib libpng15.15.dylib_old
ln -s /usr/X11/lib/libpng15.15.dylib .