mod_wsgi错误:ImportError:dlopen(/usr/local/lib/python3.6/site-packages/cv2.so,2):找不到符号:_iconv

时间:2017-07-18 10:35:55

标签: python apache opencv mod-wsgi

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

我在使用mod_wsgi的Apache应用程序(没有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)

2 个答案:

答案 0 :(得分:1)

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

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

LoadFile /usr/lib/libiconv.dylib

答案 1 :(得分:1)

问题和解决方案的可能原因:XAMPP出现了问题。 XAMPP使用动态库(例如:libiconv.dylib,libtiff.dylib等),它们在Apache服务器启动时加载/链接。这些库可以在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

即便如此,通过在Apache的配置文件中手动添加LoadFile /usr/lib/libiconv.dylib也无法按照 Grapham Dumpleton 的建议进行操作。

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

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

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