読者です 読者をやめる 読者になる 読者になる

けつあご日記

こんちは.菊地です.なんか浅ーいことをいろいろ書きます

openCVのImportErrorとかの話【なれない日記20160702】

なれない日記 Python


昨日に引き続きanaconda環境を整えている.
www.ketsuago.com

opencvを使うのに手こずった

昨日無事にopencv3をインストールしたので,importできるか確かめたところ,

$ python
Python 3.5.1 |Anaconda custom (x86_64)| (default, Jun 15 2016, 16:14:02) 
[GCC 4.2.1 Compatible Apple LLVM 4.2 (clang-425.0.28)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: dlopen(/Users/HKikuchi/.pyenv/versions/anaconda3-4.0.0/lib/python3.5/site-packages/cv2.cpython-35m-darwin.so, 2): Library not loaded: @rpath/libhdf5.10.dylib
  Referenced from: /Users/HKikuchi/.pyenv/versions/anaconda3-4.0.0/lib/libopencv_hdf.3.1.0.dylib
  Reason: Incompatible library version: libopencv_hdf.3.1.dylib requires version 12.0.0 or later, but libhdf5.10.dylib provides version 11.0.0

...うんこ

Library not loaded: @rpath/libhdf5.10.dylib

とあるので,@rpathなるところにlibhdf5.10.dylibのリンクを貼ってやれば良いと思った.こちらを見ながら.
qiita.com

find / -name libhdf5.10.dylib

すると

/Users/HKikuchi/.pyenv/versions/anaconda3-4.0.0/lib/libhdf5.10.dylib

とあったので,ここへのシンボリックリンクを貼ってやればええんや.楽勝や.いやちょっとまて@rpathってどこだ?検索してもよくわからなかった.ので,適当に/usr/local/lib/にでも貼ってみた(超馬鹿).

ln -s /Users/HKikuchi/.pyenv/versions/anaconda3-4.0.0/lib/libhdf5.10.dylib /usr/local/lib/

もう一回importしてみたがダメ.謎の@rpathなるところへリンク貼ってみる.

ln -s /Users/HKikuchi/.pyenv/versions/anaconda3-4.0.0/lib/libhdf5.10.dylib @rpath

特にエラーも出ないしいけたのでは?と思ったが,やっぱりダメだった.

上の参考リンクでは,importエラーの理由が,

Reason: image not found

だったが,私の場合

Reason: Incompatible library version

だったので,少し事情が違うのかと思って,このエラーメッセージでググった.するとドンピシャなサイトが.
taizo.hatenablog.jp

libhdf5でエラーが出たときはlibhdf5をインストールしたりアップデートしたりすれば良いらしい.

$ brew tap homebrew/science
$ brew install hdf5
$ brew search
$ conda update libhdf5

意気揚々とコマンドを打っていく.が,二個目で不穏なエラーが.

Error: The `brew link` step did not complete successfully
The formula built, but is not symlinked into /usr/local
Could not symlink lib/libhdf5.10.dylib
Target /usr/local/lib/libhdf5.10.dylib
already exists. You may want to remove it:
  rm '/usr/local/lib/libhdf5.10.dylib'

To force the link and overwrite all conflicting files:
  brew link --overwrite hdf5

To list all files that would be deleted:
  brew link --overwrite --dry-run hdf5

Possible conflicting files are:
/usr/local/lib/libhdf5.10.dylib -> /Users/HKikuchi/.pyenv/versions/anaconda3-4.0.0/pkgs/hdf5-1.8.15.1-2/lib/libhdf5.10.dylib

テキトーなシンボリックリンク作成がやっぱり裏目に出てconflictした.調べるとrmよりunlinkがベターらしいので,unlinkしたあと言われたとおりbrew linkした(overwriteオプションが付いているので多分/usr/local/lib/の方をわざわざunlinkしなくても良いのかもしれない)

cd /usr/local/lib
unlink libhdf5.10.dylib
brew link --overwrite --dry-run hdf5

念のため,4つのコマンドやり直し.

$ brew tap homebrew/science
$ brew install hdf5
$ brew search
$ conda update libhdf5

これでやっとimport cv2ができた.NKT...

@rpathとは何だったのか

要するに実行ファイルをコンパイルするときに,「ここに必要な共有ライブラリ置いといたから使うときは見てね」という感じで教えておくパス...だと思う.実際にgccでコンパイルするときにrpathを渡してやる作業をやってみるとわかりやすいだろう.と思ってやってみようとしたら,gccを使うにはxcodeのインストールをする必要があるらしい.私の自宅の最弱ネットワーク環境では数時間かかってしまいそう.ということで明日いろいろやってみてまとめる.

/usr/bin/gccはclangだってよ

というかなんではじめから入っている/usr/bin/gccは使えないんだ??と思ったら,こいつはgccの皮を被ったclangらしい.確かにgccとだけ打つとclangのエラーが出るし,gcc --versionを打つとclangのバージョンが出てくる.流石に草生えるwこんなん反則でしょw というわけで普通にgccを使うには上述のようにxcode(というかCommand Line Toolsなるもの)のインストールが必要らしい.

恥ずかしながらClangというものを知らなかった.wikipediaをちら見したところ,「GCC(GNU Compiler Collection)はライセンス的にびみょいし,Objective-Cの性能上げるのにあんま良くないから,もうAppleで一からコンパイラ作るわ.しかもオープンソースにするわ.ドヤァ」というような背景で生まれた感じらしい.

ということはほとんど同じような機能を持っていると考えて良いのだろうか.同じようにrpathを渡すこともできるのだろうか.これももう少し調べてみよう.

OSSにもいろいろあるんだなぁ

あと,「オープンソースの定義は一つで,GNUもオープンソース」だと勘違いしていた.死にたい.どうやらGPL*1(GNU General Public License)というOSSライセンス体系らしい.以下引用.

このライセンスの要点は3点。1点目は「著作権表示を保持しなければならない+無保証である」という事。

著作権が表示された部分は必ずそのままにしておいてね。そんで、これを使用した結果いかなる損害が発生しても、責任は自分で負ってね、という事です。

2点目は、「GPLライセンスのオープンソース・フリーソフトウェアは、誰でも自由に複製・改変・頒布することが許可されている」という事。

つまり、「A」というGPLライセンスのソフトウェアを入手した場合、「A」に改良を加え「A’」というソフトウェアを制作し、それを公開したり販売したりしてもいいよ、という事です。

そして3点目。「GPLライセンスのソフトウェアやプログラムを使用した場合、その制作物もGPLライセンスで配布しなければならない」という、歪みねぇ制約。

この制約は、いわゆる“コピーレフト”という考え方である。これが最もGPLの最も特徴的な部分であり、物議をかもす点でもある。

つまり、「A」に改良を加えた「A’」というソフトウェアは、「誰でも自由に複製・改変・頒布することを許可」しなければならない。「A’」を売ってもいいけど、それが無料で再配布されても文句は言えないよ、と。

さらに突っ込むと、あなたが制作した「B」というソフトウェアのごくごく一部分にでもGPLライセンスのものを使用した場合、例えそれが1行のプログラムだとしても「誰でも自由に複製・改変・頒布することを許可」しなければならない。

http://smkn.xsrv.jp/blog/2009/03/summary_for_gpl_mit_cc_etc/

なるほど.コピーレフトなんですね.多分Clangを作った人たちが嫌ったのはこの点なんですかね.Clangのライセンスを見るとCopyleft: noになってます.


言葉を知らないからwikipediaを読むのも一苦労である.つらい.死ぬか勉強するかしかない.明日は@rpathの謎に迫りたい.迫りかけぐらいにはなりたい.



↓アフィカスリンク

UNIXという考え方―その設計思想と哲学

UNIXという考え方―その設計思想と哲学

*1:これも"GNU"と同じで再帰的頭字語だ(...ちょっと違う気もする).GNUは再帰的頭字語が好きなんだろうか.