Help us understand the problem. What is going on with this article?

IDEを使わずにOpenCVを使ったC++ソースファイルをビルドする

More than 1 year has passed since last update.

背景

IDEを使えば,C++のOpenCVの環境構築はかなり楽(参考になるブログが多数あるので)だと思います.
しかしエディタを使った開発の場合,OpenCVの設定が少し面倒だったので,開発環境の構築について(主にビルドすることを目標として)自分用に少しメモを残しておきます.

(そこまで深く理解しているわけではないので,誤った記述があるかもしれません.あくまで自分用メモです.)

目的

OpenCVを使ったソースファイルをコマンドラインからビルド出来るようになること.

とりあえずOpenCVのサンプルを動かす

実行環境は次の通りです.

  • OS : macOS High Sierra (version 10.13.6)
  • コンパイラ : g++, Apple LLVM version 9.1.0 (clang-902.0.39.2)
  • pkg-cofig : version 0.29.2
  • OpenCV : version 3.4.2

g++, pkg-config, OpenCVのインストールがまだの場合は,事前にインストールしておいてください.

実行手順1. 環境の用意

OpenCVのサンプルコードであればなんでもいいかと思います.

もしなければ,次のサンプルを使って下さい.
https://github.com/hsmtknj/opencvsample

git clone https://github.com/hsmtknj/opencvsample.git
でまるまる環境を落とせるかと思います.

実行手順2. ビルド

OpenCVを使ったソースファイルがあるディレクトリに移動して(先ほどサンプルをダウンロードした場合はopencvsampleディレクトリ内に移動),次のコマンドを打って下さい.

# cppファイルをビルドして,実行ファイルを作成します
g++ sample1.cpp -o sample1.out `pkg-config --cflags opencv` `pkg-config --libs opencv`

sample1.cppsample1.outは自分の環境に合わせて,適宜変更して下さい.

そうすると,実行ファイルが生成されるかと思います.(先ほど環境をダウンロードした場合は,sample1.out ができているかと思います.)

あとは以下のコマンドを実行することで,とりあえず動くかと思います.

# 作成された実行ファイルを実行します
./sample1.out

コマンドラインからの実行を楽にするMakefileやCMake

OpenCVを使ったソースファイルをコマンドラインからビルドする際に,MakefileやCMakeがどのように関わってくるか分からなかったので,以下に大きな流れをまとめてみました.

先ほど,とりあえずOpenCVのサンプルを動かしたのは以下の"1."を実行したことになるかと思います.

  1. コマンドラインからpkg-configを使ってOpenCVを使ったファイルをビルドする
    • コンパイラでビルドするときに,オプションでpkg-configを使う
  2. 毎回コマンドラインから実行するのは面倒なので,Makefileスクリプトを書く
    • makeコマンド一発でビルドできるようになる
  3. Makefileスクリプトすら編集するのが面倒なのでCMakeを使う
    • CMakeLists.txtを用意することで,Makefileを自動で生成してくれる

コマンドラインから実行

こちらのブログが大変参考になります.

コマンドラインからpkg-configを使ってコンパイラでコンパイル・ビルドする方法について書かれています.
pkg-configを利用するとOpenCVのリンカなど面倒な部分の設定を全部上手くやってくれるっぽいです.

使い方は大変シンプルで,ビルド時に以下のようにコンパイラにpkg-configのオプションをつけるだけです.コンパイラは代表的なg++を利用していますが,お好みのコンパイラで良いと思います.

g++ sample1.cpp -o sample1.out `pkg-config --cflag opencv` `pkg-config --libs opencv`

これで,sample1.cppから実行ファイルsample1.outが出来ると思います.あとは以下のコマンドで実行ファイルを実行できます.

./sample1.out

参考

このあたりで,コンパイルとビルドが同じものだと思っていたり,オブジェクトコードやリンカの話が全くわからない場合,話が分からなくなってくると思うので参考までに

毎回コマンドラインからの実行は面倒

ソースファイルを変更して,いちいちコマンドラインからビルドコマンドを入力するのは面倒です.
そこで,Makefileを使って簡単にコマンドラインからビルドする方法があります.
これは,先ほどの

g++ sample1.cpp -o sample1.out `pkg-config --cflag opencv` `pkg-config --libs opencv`

のようなコマンドをMakefileと呼ばれるスクリプトにあらかじめ記述しておくことで,makeというコマンドをひとつ打つだけで実行できるようにするものです.

Makefileのサンプル

次のようにMakefileスクリプトを記述してみました.

sample1: sample1.cpp
    # build sample1.cpp
    g++ sample1.cpp -o sample1.out `pkg-config --cflags opencv` `pkg-config --libs opencv`
    # execute
    ./sample1.out
    # delete execution file
    rm sample1.out

sample2: sample2.cpp
    # build sample2.cpp
    g++ sample2.cpp -o sample2.out `pkg-config --cflags opencv` `pkg-config --libs opencv`
    # execute
    ./sample2.out
    # delete execution file
    rm sample2.out

このようにコマンドをあらかじめ,設定しておくと楽になります.

先ほどのhttps://github.com/hsmtknj/opencvsampleには上記のMakefileを含めたmakeコマンドを試す環境を用意しています.

このディレクトリを落としてきて,ディレクトリ内で

# makefileに書いた"sample1"の方を実行します
make sample1
# makefileに書いた"sample2"の方を実行します
make sample2

上記のmakeコマンドをコマンドラインから試すと,ソースファイルのビルドから実行まで行う様子を見ることができると思います.

Makefileの使い方について以下のブログが参考になるかと思います.
トリビアなmakefile入門

Makefile の編集すら面倒

そういった場合にCMakeが活躍します.

CMakeLists.txtにコンパイル・ビルド,オプション情報などを事前に記述しておくことで,Makefileのスクリプトを自動で生成してくれます.

CMakeの使い方は,以下のブログが大変分かりやすいです.(本当に分かりやすい)

まとめ

pkg-configMakefileCMakeを利用することで,コンパイラでターミナルからOpenCVをビルドすることができました.

ご利用のエディタでさらに凝った設定をすると,コマンドラインからではなくエディタのショートカット等で簡単にファイルの実行できそうですね.

備考

今回あわててまとめたので,大幅に記事を変更する可能性があります.ご了承ください.

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away