この記事は第一回、第二回の続きになります。それぞれの内容をざっくりと説明しときますと、
第一回は青写真を示したような感じで、OpenCVってそもそも何かとか、インストールには2通りの方法があるみたいなことを説明しました。僕の環境について書いた回でもありました。
第二回はOpenCVをビルドするに当たって、ソースコードはどこからダウンロードすればいいかとか、その際の注意事項を説明しました。ついでに、僕のような環境だとどんなコマンドを実行すればいいかについても説明しました。
今回は、第二回でダウンロードしてきたソースコードをビルドしていく回になります。
ビルドのために
ビルドをする際に必要なファイルは、環境によって違ってきます。例えば、僕の愛用しているGCC/G++だとMakefileですが、Visual Studio Codeならソリューションファイルが必要になります。
OpenCVは、git cloneでリポジトリをダウンロードしてきた状態ではMakefileやソリューションがまだ無い状態になっています。そこで、環境に合った中間ファイル(Makefileとかソリューションとか)を生成する必要があります。
その中間ファイルの生成にCMakeを使います。公式サイトには次のように書かれています。
At this step CMake will verify that all necessary tools and dependencies are available and compatible with the library and will generate intermediate files for the chosen build system.
この段階で、CMakeはすべての必要なツールと依存関係が利用可能で、かつライブラリと互換性があるか確かめる。そして、CMakeは選択されたビルドシステムに応じた中間ファイルを生成する。
cmake-gui
application allows to see and modify available options using graphical user interface. See https://cmake.org/runningcmake/ for details.cmake-guiアプリは利用可能なオプションをGUIを使って変更したり、確認したりできる。詳細はhttps://cmake.org/runningcmake/を見てほしい。
要するに、CMakeを使ってMakefileなりソリューションファイルなりを生成しようってことですな。そのときはCUIとGUIのどちらでも使えるから、好きな方を使ってねと。
CMakeにはCUIとGUIの2つが用意されているんですが、いずれにしろ環境に合った中間ファイルを作ってくれます。
この中間ファイルは環境によって内容が変わってしまうんですが、CMakeは環境に合わせた中間ファイルを自動で生成してくれます。これが「CMakeはプラットフォーム間の差異を吸収してくれる」と言ってることの意味ですな。
僕はGUIを使いましたが、CUIを使う場合は次のようなコマンドを実行します。
cmake -G<generator> <configuration-options> <source-directory>
<generator>でMakefileとかソリューションとかを、<configure-options>に必要な構成オプションを、<source-directory>に前回記事でダウンロードしてきたopencvのディレクトリを指定します。
その設定の指定方法は後述します。公式サイトの流れ通り、先にビルドの流れを解説していきます。
ビルドの実行
これまでで、ソースコードの取得とMakefile(もしくはソリューション)の作成が済んでいます。では、ビルドをしていきます。ビルドはcmakeを使ってもできるし、makeを使ってもできるよという旨の表記が公式サイトにあります。
During build process source files are compiled into object files which are linked together or otherwise combined into libraries and applications. This step can be run using universal command :
cmake --build <build-directory> <build-options>
… or underlying build system can be called directly :
make
ビルド中、ソースファイルはオブジェクトファイルにコンパイルされ、そのオブジェクトファイルはライブラリやアプリケーションに一緒にリンクされる、あるいは結合される。この操作は共通のコマンドを走らせることで実行できる。
もしくは、基本的なビルドシステムを直接呼び出してもいい。
要するに、cmake
かmake
コマンドを実行するとビルドが始まって、オブジェクトファイルが生成されるってことですな。その過程でソースファイルがライブラリやアプリケーションにくっつけられるってことですね。
というわけで、ここまでの手順がお済みの方は次のコマンドのどちらかを実行していただければビルドできるはずです。失敗した場合は、Makefileを作る段階での設定をいじって試行錯誤してみてください。
cmake --build <build-directory> <build-options>
make
cmakeを使う場合の<build-directory>はビルドしたい対象のあるディレクトリ、<build-options>は上の節で説明したMakefileを作るときの構成オプションではなくて、ビルド時のオプション(--target install
とか)になります。
そのビルドの成果物はどうせならMSYS2やVisual Studio Codeのライブラリフォルダに入れてほしいものです。その要求に答えてくれるのが先ほどチラッと書いた --target install
というビルドオプションになります。
--target install
を付けてcmakeを実行すれば、ユーザの指定したインストール場所に成果物を自動でコピーしてくれます。指定しない場合、UNIXなら/usr/local
にコピーされて、WindowsならC:/Program Files
にコピーされます。
公式サイトにはこのように表記されています。
During installation procedure build results and other files from build directory will be copied to the install location. Default installation location is
/usr/local
on UNIX andC:/Program Files
on Windows. This location can be changed at the configuration step by settingCMAKE_INSTALL_PREFIX
option. To perform installation run the following command :cmake --build <build-directory> --target install <other-options>
インストール中、ビルドディレクトリにあるビルドの成果物とそれ以外のファイルはインストール場所にコピーされる。デフォルトのインストール場所は、UNIXなら
/usr/local
で、WindowsならC:/Program Files
だ。この場所は設定のステップでCMAKE_INSTALL_PREFIX
オプションを設定することで変更できる。インストールを実行するために次のコマンドを実行しよう。cmake --build <build-directory> --target install <other-options>
Note
This step is optional, OpenCV can be used directly from the build directory. If the installation root location is a protected system directory, so the installation process must be run with superuser or administrator privileges (e.g.sudo cmake ...
).備考
この段階を実行するかどうかは任意であり、OpenCVはビルドディレクトリから直接使うことができる。インストール場所のルートがプロテクトのかけられたシステムディレクトリだった場合、インストールプロセスはスーパーユーザか管理者権限で実行しなければなりません(例えば、sudo cmake ...
というように)。
要するに、--target install
オプションを付けてcmakeを実行すると上に書いたようなことが出来ますよと。ただ、「OpenCVを使う」という観点で言えば、絶対にやらないといけないってわけじゃないと。
とはいえ、個人的には間違ってビルドしたライブラリを消しちゃう可能性とか、設定の手間なんかを考えるとやっておいた方が良いだろうと思いますが。
今までの話の中で、CMAKE_INSTALL_PREFIX
とかオプションの話をしていましたが、次の節で軽くどうやって設定すればいいのかって話をしていきます。
構成オプションの変更方法
構成オプションの話については公式サイトのこのページが役に立ちます。そのページをチラッと見ていただくと分かるかと思いますが、それをすべて翻訳して説明してると長くなりすぎるんで、この記事で扱った内容に関係しそうな部分だけをまとめときます。
まずは、構成オプションの設定方法です。
Configuration options can be set in several different ways:
・Command line:
cmake -Doption=value ...
・Initial cache files:cmake -C my_options.txt ...
・Interactive via GUI構成オプションは複数の方法で設定できる:
・コマンドライン:
cmake -Doption=value ...
・初期キャッシュファイル:cmake -C my_options.txt ...
・GUIによる対話形式
上の節では構成オプションはコマンドラインかGUIで設定できると説明しましたが、初期キャッシュファイルを使う方法と合わせて、3つの方法で構成オプションを設定できるってことですな。で、もしCUI(コマンドライン)で設定する場合は-Doption=value
という書き方で指定すると。
なので、上の節で説明したCMAKE_INSTALL_PREFIX
を設定する場合は-DDCMAKE_INSTALL_PREFIX=<ディレクトリ>
という形式で指定すればいいということになります。
ディレクトリの指定方法をまた公式サイトから引用してみます。
This path can be relative to current working directory, in the following example it will be set to
<absolute-path-to-build>/install
:cmake -DCMAKE_INSTALL_PREFIX=install ../opencv
このパスは現在のワーキングディレクトリに対する相対パスにできる。次の例では
<absolute-path-to-build>/install
に設定している。cmake -DCMAKE_INSTALL_PREFIX=install ../opencv
コマンドラインからcmakeを実行する場合はカレントディレクトリとしてopencvが置かれているフォルダを指定するでしょうが、そのフォルダからの相対パスで指定してもいいんだよと。もしinstallと指定すれば、カレントディレクトリにあるinstallというフォルダにコピーされることになるとも説明されています。
上の節でも注意しましたが、管理者権限が無いと変更できないようなディレクトリを指定した場合は、--target install
を管理者権限で実行するのをお忘れなく。
これで、とりあえずOpenCVをビルドする方法は解説しました。構成オプションにも色々な種類があるので、公式サイトを見るなり、トライアルアンドエラーを繰り返すなりしてくださいませ~。
気が向いたら構成オプションの説明をするかもしれませんが、とりあえずOpenCVのビルド説明は以上になります。ここまで読んで頂いてありがとうございました。
また次の記事でお会いしましょう~。ではでは~。