【问题标题】:mod_wsgi Error: ImportError: dlopen(/usr/local/lib/python3.6/site-packages/cv2.so, 2): Symbol not found: _iconvmod_wsgi 错误:ImportError: dlopen(/usr/local/lib/python3.6/site-packages/cv2.so, 2): Symbol not found: _iconv
【发布时间】:2017-12-23 04:14:25
【问题描述】:

我正在配置一个 Python 应用程序,它在 MacOSx (El Capitan) 系统上使用 OpenCV 和 Apache (XAMPP)。而且,我正在使用mod_wsgi。根据安装指南,mod_wsgi 已经成功(并且正确地)使用 Python3.6 和 XAMPP 的 apache 版本构建。

我之前使用过一个 Python 应用程序(没有 OpenCV)和 Apache 使用 mod_wsgi,它已经正常工作了。

但是,我现在有另一个使用 OpenCV 的应用程序,我收到以下错误(来自 Apache 的错误日志),我对此一无所知,而且我在互联网上没有找到类似的东西:

[Tue Jul 18 12:12:53.547655 2017] [wsgi:error] [pid 19030] [remote ::1:51718]
import cv2
[Tue Jul 18 12:12:53.547686 2017] [wsgi:error] [pid 19030] [remote ::1:51718] 
ImportError: dlopen(/usr/local/lib/python3.6/site-packages/cv2.so, 2): Symbol not found: _iconv
[Tue Jul 18 12:12:53.547698 2017] [wsgi:error] [pid 19030] [remote ::1:51718]
Referenced from: /System/Library/PrivateFrameworks/LanguageModeling.framework/Versions/A/LanguageModeling
[Tue Jul 18 12:12:53.547706 2017] [wsgi:error] [pid 19030] [remote ::1:51718]   Expected in: /Applications/XAMPP/xamppfiles/lib/libiconv.2.dylib
[Tue Jul 18 12:12:53.547713 2017] [wsgi:error] [pid 19030] [remote ::1:51718]  in /System/Library/PrivateFrameworks/LanguageModeling.framework/Versions/A/LanguageModeling

/usr/local/lib/python3.6/site-packages/cv2.so的输出

@rpath/libopencv_shape.3.2.dylib (compatibility version 3.2.0, current version 3.2.0)
@rpath/libopencv_superres.3.2.dylib (compatibility version 3.2.0, current version 3.2.0)
@rpath/libopencv_stitching.3.2.dylib (compatibility version 3.2.0, current version 3.2.0)
@rpath/libopencv_videostab.3.2.dylib (compatibility version 3.2.0, current version 3.2.0)
@rpath/libopencv_objdetect.3.2.dylib (compatibility version 3.2.0, current version 3.2.0)
@rpath/libopencv_photo.3.2.dylib (compatibility version 3.2.0, current version 3.2.0)
@rpath/libopencv_video.3.2.dylib (compatibility version 3.2.0, current version 3.2.0)
@rpath/libopencv_calib3d.3.2.dylib (compatibility version 3.2.0, current version 3.2.0)
@rpath/libopencv_features2d.3.2.dylib (compatibility version 3.2.0, current version 3.2.0)
@rpath/libopencv_flann.3.2.dylib (compatibility version 3.2.0, current version 3.2.0)
@rpath/libopencv_ml.3.2.dylib (compatibility version 3.2.0, current version 3.2.0)
@rpath/libopencv_highgui.3.2.dylib (compatibility version 3.2.0, current version 3.2.0)
@rpath/libopencv_videoio.3.2.dylib (compatibility version 3.2.0, current version 3.2.0)
@rpath/libopencv_imgcodecs.3.2.dylib (compatibility version 3.2.0, current version 3.2.0)
@rpath/libopencv_imgproc.3.2.dylib (compatibility version 3.2.0, current version 3.2.0)
@rpath/libopencv_core.3.2.dylib (compatibility version 3.2.0, current version 3.2.0)
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 307.4.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.0.0)

【问题讨论】:

    标签: python apache opencv mod-wsgi


    【解决方案1】:

    看起来当 cv2 的 C 扩展被编译时,它假定 libiconv 库已经链接到 Python 可执行文件,而不是仍然链接它本身。当 Python 嵌入 Apache 时,由于 Apache 未链接到 libiconv 库中,因此缺少该函数。

    作为一种解决方法,将以下行添加到任何 VirtualHost 定义之外的 Apache 配置中。

    LoadFile /usr/lib/libiconv.dylib
    

    【讨论】:

    • 我刚刚在我的虚拟主机中添加了提供的“LoadFile”语句。但是,它仍然显示相同的错误。有趣的是,在它显示与“libtiff.5.dylib”文件类似的错误(库未加载且库版本不兼容)之前,我在没有 libtiff 的情况下编译了 OpenCV。而且,现在它显示当前错误(符号不是错误)。
    • 我刚刚检查了“/usr/lib”目录中的文件,发现了以下相关文件:libiconv.dylib、libiconv.2.dylib 和 libiconv.2.4.0.dylib。而且,权限是 lrwxr-xr-x 、 -r-xr-xr-x 和 lrwxr-xr-x 。权限也很好。
    • 运行otool -L /usr/local/lib/python3.6/site-packages/cv2.so会得到什么?您是否使用 Brew 安装了 libiconv 库,并且可能在构建 cv2 包时使用,这意味着您应该加载它?
    • 避免从 Brew 安装 libiconv。那可能只会使事情变得混乱。如果你运行nm /usr/local/lib/python3.6/site-packages/cv2.so | grep iconv,你会得到什么。
    • MacOS X 和 Windows 上的第三方发行版或不太常见的发行版通常会成为问题。它们要么需要使用自己的捆绑库,因此与 Python 发行版不兼容,要么甚至不提供头文件以允许您正确构建其他 Apache 模块。
    【解决方案2】:

    问题的可能原因和解决方案:问题来自 XAMPP。 XAMPP 使用在 Apache 服务器启动时加载/链接的动态库(例如:libiconv.dylib、libtiff.dylib 等)。这些库可以在Applications/XAMPP/xampfiles/lib 中找到。当然,这些库有一定的版本。

    其中一些库也存在于 MacOS 系统库中,可在 /usr/lib 中找到。这些库可能具有与 XAMPP 不同的版本。这在使用 OpenCV 时会导致冲突,因为在构建 OpenCV 时(从源代码或使用 Brew 命令),它将一些 OpenCV 本机动态库与系统库链接。

    现在,当使用 XAMPP 的 apache 服务器时,它会以某种方式强制 OpenCV 不使用系统库,而是使用自己的动态库。而且,由于版本不同,它会导致冲突,从而导致错误,例如:Symbol not found: _iconvIncompatible Library versions。它使用 XAMPP 库 (libiconv.dylib) 而不是同一个对应的 MacOS 的库。在 XAMPP 的 libiconv.dylib 中,该符号不存在,但在 MacOS 的 libiconv.dylib 中存在。这可以使用以下命令进行检查:

    nm /usr/lib/libiconv.dylib | grep iconv
    nm Applcations/XAMPP/xamppfiles/lib/libiconv.dylib | grep iconv
    

    即使像 Grapham Dumpleton 所建议的那样,在 Apache 的配置文件中手动添加 LoadFile /usr/lib/libiconv.dylib 也不会奏效。

    所以,我没有使用 XAMPP 的 apache,而是使用了 MacOS 的默认 Apache 服务器。它已经正确解决了。我认为这是因为 MacOS 的 Apache 使用了 OpenCV 也使用的系统库,因此不再存在冲突。

    注意:为了使用 MacOS 的 apache 服务器,您需要重新配置所有内容(PHP、MySQL Server 和 phpMyAdmin)。按照this link 进行配置。

    此外,您需要再次构建mod_wsgi,因为 XAMPP 和默认 MacOS 中的 Apache 版本很可能不同。

    【讨论】:

    • 请注意,即使使用 Apple 版本的 Apache,也可能会发生一个共享库冲突。这是如果您使用 PSF 中的 Python 3.6+,因为它捆绑了自己的 OpenSSL 库。如果您在 Apache 中使用 mod_ssl,它会拖入覆盖 Python 的系统 SSL 库,因此会出现冲突并且无法正常工作。如果使用 Python 3.6,则无法在 Apache 中使用 mod_ssl。
    猜你喜欢
    • 1970-01-01
    • 2017-04-25
    • 1970-01-01
    • 2016-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-27
    相关资源
    最近更新 更多