2017-07-18 5 views
0

私はApacheでOpenCVを使用するPythonアプリケーションを構成しています(XAMPP )MacOSx(エルキャピタン)システムで。そして、私はmod_wsgiを使用しています。 mod_wsgiはPython3.6とXAMPPのapacheバージョンでインストールガイドに従って正常に(そして正しく)ビルドされています。mod_wsgiエラー:ImportError:dlopen(/usr/local/lib/python3.6/site-packages/cv2.so、2):シンボルが見つかりません:_iconv

私はmod_wsgiのを使用してApacheと(OpenCVのなし)Pythonアプリケーションの前に使用していると、それはすでに正常に働いています。

しかし、私は今のOpenCVを使用し、私は私がインターネットに似た何かを見つけることができませんでしたmorever、についてどんな考えを持っていない、次のエラー(アパッチからのエラーログ)を取得しています別のアプリケーションがあります。

を /usr/local/lib/python3.6/site-packages/cv2.so
[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 

出力:CV2のためのC拡張がコンパイルされたとき、それはlibiconvと仮定よう

@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は、Apacheサーバーの起動時にロード/リンクされる動的ライブラリ(libiconv.dylib、libtiff.dylibなど)を使用します。これらのライブラリはApplications/XAMPP/xampfiles/libにあります。もちろん、これらのライブラリには特定のバージョンがあります。

これらのライブラリのいくつかはまた、/usr/libで見つけることができMacOSのシステムライブラリに存在します。これらのライブラリは、XAMPPバージョンとは異なるバージョンを持つ場合があります。これは、OpenCVがビルドされるとき(ソースコードまたはBrewコマンドを使用して)、OpenCVのネイティブダイナミックライブラリの一部とシステムライブラリをリンクするため、OpenCVを使用するときに競合が発生します。 XAMPPのApacheサーバを使用する場合

は今、それは何らかの形で、むしろそれは、独自の動的ライブラリを使用して、システムライブラリを使用しないようにOpenCVのを強制します。また、異なるバージョンのため、エラーにつながる競合が発生します。Symbol not found: _iconvまたはIncompatible Library versions。対応するMacOSの同じライブラリではなく、XAMPPライブラリ(libiconv.dylib)を使用します。 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サーバとphpMyAdminの)再びすべてを設定する必要があります。構成については、this linkに従ってください。

また、XAMPPとデフォルトのMacOSでApacheのバージョンが非常に異なる可能性があるため、mod_wsgiを再度ビルドする必要があります。

+0

AppleバージョンのApacheを使用している場合でも、共有ライブラリの競合が発生する可能性があることに注意してください。これは、独自のOpenSSLライブラリがバンドルされているため、PSFからPython 3.6+を使用している場合です。 Apacheでmod_sslを使用すると、システムのSSLライブラリをドラッグしてPythonのものを上書きするため、競合が発生して動作しません。 Python 3.6を使用している場合、Apacheでmod_sslを使用することは不可能です。 –

1

が見えますライブラリは既にあったPython実行可能ファイルにリンクされています。 PythonがApacheに組み込まれている場合、Apacheがlibiconvライブラリにリンクしていないため、この関数はありません。回避策として

、任意VirtualHost定義の外側Apache設定に次の行を追加します。

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パッケージがビルドされたときに使用されていました。 –

関連する問題