2017-07-18 38 views
0

我配置,它使用的OpenCV與Apache Python應用程序(XAMPP )在MacOSx(El Capitan)系統上。而且,我正在使用mod_wsgi。根據安裝指南,mod_wsgi已成功(並正確)用Python3.6和XAMPP的apache版本構建。mod_wsgi的錯誤:導入錯誤:執行dlopen(/usr/local/lib/python3.6/site-packages/cv2.so,2):符號未找到:_iconv

我有一個Python應用程序(不OpenCV的)與Apache之前使用mod_wsgi的使用,它已經工作正常。

不過,我現在它使用了OpenCV,我收到以下錯誤(Apache的錯誤日誌),我沒有約,morever我沒有找到在互聯網上類似的任何想法,其他應用程序:

[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) 

回答

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鄧普爾頓的建議不奏效。

因此,我沒有使用XAMPP的apache,而是使用了MacOS的默認Apache服務器。它已經解決了。我認爲這是因爲MacOS的Apache使用了OpenCV使用的系統庫,因此,不再存在衝突。

注:爲了使用MacOS的的Apache服務器,您需要重新配置的一切(PHP,MySQL服務器和phpMyAdmin的)。按照this link進行配置。

此外,您還需要再次構建mod_wsgi,因爲Apache XAMPP和默認MacOS中可能有不同版本的Apache。

+0

請注意,即使使用Apple版本的Apache,也會發生共享庫衝突。這是因爲您使用PSF中的Python 3.6+,因爲它捆綁了自己的OpenSSL庫。如果你在Apache中使用mod_ssl,它會拖拽到覆蓋Python的系統SSL庫中,所以會出現衝突並且不起作用。如果使用Python 3.6,那麼不可能在Apache中使用mod_ssl。 –

1

看起來當CV2的C擴展被編譯等,它假定libiconv圖書館已經鏈接到Python可執行文件,而不是仍然鏈接它本身。當Python嵌入在Apache中時,由於Apache不在libiconv庫中鏈接,所以缺少該功能。

作爲一種變通方法,下面的行添加到Apache配置的任何VirtualHost定義之外。

LoadFile /usr/lib/libiconv.dylib 
+0

我剛剛在我的虛擬主機中添加了提供的「LoadFile」語句。但是,它仍然顯示相同的錯誤。有趣的是,在它顯示與「libtiff.5.dylib」文件(庫未加載和不兼容庫版本)類似的錯誤,然後,我沒有libtiff編譯OpenCV。而且,現在它顯示了當前的錯誤(符號不是錯誤)。 – Sanchit

+0

我剛剛檢查了「/ usr/lib」目錄中的文件,發現了以下相關文件:libiconv.dylib,libiconv.2.dylib和libiconv.2.4.0.dylib。而且,權限是lrwxr-xr-x,-r-xr-xr-x和lrwxr-xr-x。權限也很好。 – Sanchit

+0

當你運行''otool -L/usr/local/lib/python3.6/site-packages/cv2.so''時你會得到什麼?你有一個使用Brew安裝的''libiconv'庫,它可能在構建cv2包時使用,這意味着你應該加載它嗎? –

相關問題