OpenCVの環境構築を頑張ってみた(Mac)
TLでOpenCVの環境構築に苦戦している人がいたので、それに刺激されて僕の方も一度放棄したOpenCVの環境構築に再挑戦してみることにした。
とりあえず参考になりそうなサイトとして
http://stackoverflow.com/questions/24985713/opencv-undefined-symbols-for-architecture-x86-64-error
http://www.yasutomo57jp.com/2010/09/01/linuxでopencvを入れて適当なコードをコンパイルするまで/
などを見つけたのでこれらを見つつ進めてみる。
とりあえずテストコードをネットから拾ってきてg++でコンパイルしたが、
Undefined symbols for architecture x86_64:
"_cvCreateImage", referenced from:
_main in testopencv-7eff1a.o
"_cvDestroyAllWindows", referenced from:
_main in testopencv-7eff1a.o
"_cvGetSize", referenced from:
_main in testopencv-7eff1a.o
"_cvLoadImage", referenced from:
_main in testopencv-7eff1a.o
"_cvNamedWindow", referenced from:
_main in testopencv-7eff1a.o
"_cvReleaseImage", referenced from:
_main in testopencv-7eff1a.o
"_cvShowImage", referenced from:
_main in testopencv-7eff1a.o
"_cvSmooth", referenced from:
_main in testopencv-7eff1a.o
"_cvWaitKey", referenced from:
_main in testopencv-7eff1a.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
こんな感じで弾かれてしまった。どうもリンクがうまくいっていないみたい?
「(1)cv.hなどのOpenCVのヘッダファイルが何処にあるのかの指定と,(2)libcvなどのOpenCVのライブラリが何処にあるのかの指定が必要です.」
とのことらしい。
まず,(1)のヘッダファイルについては
pkg-config --cflags opencv
でリストアップ可能で、(2)のライブラリについても同様に
pkg-config --libs opencv
を実行することでリストアップできるらしい。
この結果を
g++ -o main main.cpp -I/usr/include/opencv -L/usr/lib/opencv -lcv -lhighgui(この-o main main.cppというのは実行ファイルをmainという名前で作成するってことだろうか?)
みたいな感じでg++の引数として渡してやれば良いらしい。
また
g++ -o main main.cpp `pkg-config --cflags opencv` `pkg-config --libs opencv`
こう書けば実行時に勝手に後ろにつけたコマンドを実行して、その結果を引数として取ってくれるとか。
試してみるとうまく実行された。ちなみに同じディレクトリにMakefile(今回名前はGNUmakefileにしたがこれでないといけないかはよく分からない)を作成して
(ファイル名): (ファイル名).cpp
g++ (ファイル名).cpp -o (希望の実行ファイル名) `pkg-config --cflags opencv` `pkg-config --libs opencv`
と書き込んでおくと
make
とコマンドを打つだけで実行ファイルを作ってくれる。これでひとまずは安心?か。OpenCV3の方がこれでうまくいくのかはよく分からない。