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

なまもの備忘録

気になったことをつらつらと書いていきます

OpenCVの環境構築を頑張ってみた(Mac)

Mac C++

TLでOpenCVの環境構築に苦戦している人がいたので、それに刺激されて僕の方も一度放棄したOpenCVの環境構築に再挑戦してみることにした。
とりあえず参考になりそうなサイトとして
http://stackoverflow.com/questions/24985713/opencv-undefined-symbols-for-architecture-x86-64-error
http://www.yasutomo57jp.com/2010/09/01/linuxopencvを入れて適当なコードをコンパイルするまで/ などを見つけたのでこれらを見つつ進めてみる。
とりあえずテストコードをネットから拾ってきて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の方がこれでうまくいくのかはよく分からない。