CMakeで外部ライブラリとリンクさせたりするのどうすんのという話。




CMakeで外部ライブラリとリンクさせたりするのどうすんのという話。


どうも、今までVC++書いてきていたので、ライブラリとかをビルドするときにCMakeとか使っていたものの、Visual StudioのおかげでmakefileとかCMakeListsなどは書かないで過ごしてきた人です。

しかし最近Linux(Ubuntu)上でC/C++書きたくなったのでCMake書くことになり。
どうすんだ?これ。
と途方にくれたのでやり方とかいろいろ書いておきます。

私のやることは相変わらずOpenCVで遊ぶ、なので具体例としてOpenCVでやっていますが、外部のライブラリをつなげる要領はなんでも同じだと思います。

今回は自作のプログラムにOpenCVを組み込むところまでをやっていきたいと思います。

こう書けばビルドできまっせ〜みたいな記事はたくさんあるんだけど正直CMake入門者的にはなにやってんだこいつ的な感じなので(私はそうだった)基本的なとこから理解できるような感じで書いていきます。


やることは簡単

まぁvisual studioでやる場合もcmakeでビルドする場合もやることは同じで

includeディレクトリの指定
ライブラリディレクトリの指定
ライブラリの指定
です。これをどう記述していくかってだけの話ですね。


Visual Studioの時の設定。

まずプロジェクトのプロパティからこんな感じで設定しますよね。

ライブラリのdllにパスを通してから以下の3つを設定しますよね。

include
libdir
lib

私の場合全部ベタ書きです。


Linuxだとどうするの〜

まずcmake以前のお話です。

C++をビルドするのにg++を使いますよね。そこではmain.cppに全部記述されてた場合にopencvを使おうとすると次のようにコマンドを叩きます。

ぱっとみ長いですけど、opencvのライブラリ全部繋げてるので長く見えてるだけです。

g++のオプションの説明をしておくと、

  • -I:インクルードディレクトリの指定
  • -L:ライブラリディレクトリの指定
  • -l:ライブラリの指定
    です。これを毎回手打ちするだけでもまぁビルドできなくはないです。これをもっと短く書くと

のようにもかけます。

とか打ってみるとなにやってるかわかると思います。


CMakeかくよ〜

で毎度これをうつのはめんどくさいのでCMake書きましょうという話になります。

全部ベタ書きで書くとこうなります。

わざわざコメント書くまでもない感じですが、こうなります。

こんな感じで書いておいて

という感じにするとコマンド叩くとビルドできます。buildとかディレクトリいちいち作ってるのはout-of-sorceとかいってcmakeコマンドで吐き出されるものをbuildの中にして、ソースコードと分離させるためですね。ちなみにhoge.cppというソースもあるんやが〜〜という場合は

という感じでadd_executableに書き足していけばいい感じです。

これで最低限度でCMakeを使って外部のライブラリをリンクしてビルドできるようになりました。


でもベタ書き嫌〜〜

ベタ書き嫌ですよね。普通は。なので次のようにもかけます。

めちゃくちゃ完結にかけます。でこれがOpenCVとかCMake使ってビルドしたいけどどう書くんや!?というときに検索にヒットするもの。ぶっちゃけ雰囲気はわかるけどfind_packageとかどうやって動いてんの!?は!?という感じに最初陥りました。陥りますよね多分普通は。

find_package()の動作についてはあとで軽く書きますが最初にかる〜く説明すると

find_package(OpenCV REQUIRED)でOpenCVを探してきて、それらの情報を取得します。取得した情報はOpenCV_INCLUDE_DIRS,OpenCV_LIBRARIESなどの変数に格納されます。REQUIREDはこのソースビルドするのに必ず必要だかんね!という意味合いです。
${}の中に変数を書いてあげて、includeやtarget_linkなどの設定に食わせます。
そうするとビルドできるようになります。簡単。

message("${OpenCV_INCLUDE_DIRS}")

とかすると変数の中身が見える。


find_package()isなにもの

こいつは前述のとおり必要なライブラリとか見つけてくれる便利なヤツなのですが、どのようにライブラリ見つけてくるかという話が気になるところです。こいつにはモジュールモードとコンフィグモードの2種類があって、それぞれ違った感じで探索してくるようです。モジュールモードは

内のFind*.cmakeってファイルを探してきてるみたいですね。Find*.cmakeの中身見てあげるとCMakeLists.txt上で使える変数使える変数がいろいろ書いてあります。

でコンフィグモードは*Config.cmakeってファイルを探しているらしい。

OpenCVはコンフィグモードで探索されているっぽく、私の環境では/usr/local/share/OpenCV/OpenCVConfig.cmakeというファイルをみているようでした。

とかのオプションつけてcmakeコマンドうつとどこを見ているのかを教えてくれます。

でコンフィグモードがどこを探索しているのか〜という話なのですが。

詳しくはここらへんの記事に書いてあるのですが、いろいろと探索しているようです(雑)


しれっとpkg-configとか上で使ってるけどこれはなに。

cmakeとは関係のないライブラリの管理ツールです。ライブラリインストール時に*.pcというのが指定のパスに配置されてそこにいろいろ情報があるみたいです。

wikiとかにどこを参照してるかとかの話が書いてあるので、みるとなるほど〜ってなります。

参考

http://www.wagavulin.jp/entry/2017/02/20/082608

https://qiita.com/osamu0329/items/bd3d1e50edf37c277fa9

https://ja.wikipedia.org/wiki/Pkg-config


neno

都内のJK大学生。趣味はドールと一緒にお出かけして撮影すること。C++とC#が好き。C++は主にリアルタイム画像処理, C#はUnity, WPF, UWP, .NET Coreとかいろいろ。ASPとXamarin学習中。 専攻はCV。最近のおもちゃはHoloLens。

あわせて読みたい

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

%d人のブロガーが「いいね」をつけました。