mod_wsgi Error: ImportError: dlopen(/usr/local/lib/python3.6/site-packages/cv2.so, 2): Symbol not found: _iconv
mod_wsgi Error: ImportError: dlopen(/usr/local/lib/python3.6/site-packages/cv2.so, 2): Symbol not found: _iconv
我正在配置一个 Python 应用程序,它在 MacOSx (El Capitan) 系统上使用 OpenCV 和 Apache (XAMPP)。而且,我正在使用 mod_wsgi。 mod_wsgi 已根据安装指南使用 Python3.6 和 XAMPP 的 apache 版本成功(并正确)构建。
我之前使用 mod_wsgi 与 Apache 一起使用 Python 应用程序(没有 OpenCV)并且它已经正常工作。
但是,我现在有另一个使用 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)
看起来在编译 cv2 的 C 扩展时,它假定 libiconv
库已经链接到 Python 可执行文件中,而不是仍然链接它本身。当 Python 嵌入到 Apache 中时,由于 Apache 未链接到 libiconv
库中,因此缺少该函数。
作为解决方法,将以下行添加到任何 VirtualHost
定义之外的 Apache 配置。
LoadFile /usr/lib/libiconv.dylib
问题可能原因及解决方法:问题出自XAMPP。 XAMPP 使用动态库(例如:libiconv.dylib、libtiff.dylib 等),当 Apache 服务器启动时,这些动态库是 loaded/linked。这些库可以在 Applications/XAMPP/xampfiles/lib
中找到。当然,这些库有一定的版本。
其中一些库也存在于 MacOS 系统库中,可以在 /usr/lib
中找到。这些库的版本可能与 XAMPP 不同。这在使用 OpenCV 时会导致冲突,因为在构建 OpenCV 时(从源代码或使用 Brew 命令),它会将一些 OpenCV 本机动态库与系统库链接起来。
现在,当使用 XAMPP 的 apache 服务器时,它会以某种方式强制 OpenCV 不使用系统库,而是使用它自己的动态库。而且,由于版本不同,它会导致冲突,从而导致错误,例如:Symbol not found: _iconv
或 Incompatible 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
即使在 Apache 的配置文件中手动添加 LoadFile /usr/lib/libiconv.dylib
也无法像 Grapham Dumpleton 所建议的那样工作。
因此,我没有使用 XAMPP 的 apache,而是使用了 MacOS 的默认 Apache 服务器。结果正确。我认为这是因为 MacOS 的 Apache 使用了 OpenCV 也使用的系统库,因此不再存在冲突。
注意:为了使用 MacOS 的 apache 服务器,您需要重新配置所有内容(PHP、MySQL 服务器和 phpMyAdmin)。按照this link进行配置。
此外,您需要再次构建 mod_wsgi,因为 XAMPP 和默认 MacOS 中的 Apache 版本可能非常不同。
我正在配置一个 Python 应用程序,它在 MacOSx (El Capitan) 系统上使用 OpenCV 和 Apache (XAMPP)。而且,我正在使用 mod_wsgi。 mod_wsgi 已根据安装指南使用 Python3.6 和 XAMPP 的 apache 版本成功(并正确)构建。
我之前使用 mod_wsgi 与 Apache 一起使用 Python 应用程序(没有 OpenCV)并且它已经正常工作。
但是,我现在有另一个使用 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)
看起来在编译 cv2 的 C 扩展时,它假定 libiconv
库已经链接到 Python 可执行文件中,而不是仍然链接它本身。当 Python 嵌入到 Apache 中时,由于 Apache 未链接到 libiconv
库中,因此缺少该函数。
作为解决方法,将以下行添加到任何 VirtualHost
定义之外的 Apache 配置。
LoadFile /usr/lib/libiconv.dylib
问题可能原因及解决方法:问题出自XAMPP。 XAMPP 使用动态库(例如:libiconv.dylib、libtiff.dylib 等),当 Apache 服务器启动时,这些动态库是 loaded/linked。这些库可以在 Applications/XAMPP/xampfiles/lib
中找到。当然,这些库有一定的版本。
其中一些库也存在于 MacOS 系统库中,可以在 /usr/lib
中找到。这些库的版本可能与 XAMPP 不同。这在使用 OpenCV 时会导致冲突,因为在构建 OpenCV 时(从源代码或使用 Brew 命令),它会将一些 OpenCV 本机动态库与系统库链接起来。
现在,当使用 XAMPP 的 apache 服务器时,它会以某种方式强制 OpenCV 不使用系统库,而是使用它自己的动态库。而且,由于版本不同,它会导致冲突,从而导致错误,例如:Symbol not found: _iconv
或 Incompatible 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
即使在 Apache 的配置文件中手动添加 LoadFile /usr/lib/libiconv.dylib
也无法像 Grapham Dumpleton 所建议的那样工作。
因此,我没有使用 XAMPP 的 apache,而是使用了 MacOS 的默认 Apache 服务器。结果正确。我认为这是因为 MacOS 的 Apache 使用了 OpenCV 也使用的系统库,因此不再存在冲突。
注意:为了使用 MacOS 的 apache 服务器,您需要重新配置所有内容(PHP、MySQL 服务器和 phpMyAdmin)。按照this link进行配置。
此外,您需要再次构建 mod_wsgi,因为 XAMPP 和默认 MacOS 中的 Apache 版本可能非常不同。