深入浅出CMake(三):find_パッケージ依存ライブラリの追加


深入浅出CMake(一):基礎編深入浅出CMake(二):基礎文法及び九九乗算表の実現
前の2つのブログの基礎があって、私たちはすでにCMakeで比較的簡単な工事をコンパイルすることができると信じていますが、私たちはまだ多くの開発コンパイルシーンに対処することができます.
現在、エンジニアリングにサードパーティ製ライブラリを導入する方法はまだ分かりません.
Unix環境でのc++コードエンジニアリングを例に挙げます.
工事に参加するにはlibtestを導入しなければならない.soダイナミックライブラリ、ソースコードはhello.cpp.
g++でコンパイルすると、多分そうです
g++ hello.cpp -ltest -o hello -I include

ライブラリファイルを導入する場合は、ヘッダファイルのパスとライブラリファイルのパスを知る必要があります.
もし我々が1つのライブラリファイルだけでなく20個を導入した場合,最も原始的なg++コマンドライン方式では比較的苦しく,エラーも発生しやすいため,makeコンパイルを利用するためにMakefileを作成することが多い.
しかし、Makefileの作成は苦痛なこともあり、CMakeで同じ目的を簡単に実現できるので、このブログではライブラリファイルの導入状況をcmakeで処理する方法を説明します.
package
cmakeのコンパイルシステムでは、CMakeFileListsでは、ヘッダファイル、ダイナミックライブラリ、静的ライブラリなど、依存ライブラリを指す.txtではfind_package()コマンドで簡単に実現できます.
例えば、多くの学生がOpenCVで画像開発を行う可能性があります.それは非常に有名なオープンソースライブラリで、10個のライブラリファイル、数十個のヘッダファイルがあるので、どのように正確に引用するかは慎重なことですが、cmakeで簡単にできます.
前提条件として、あなたのPCにはOpenCVが完全にインストールされています.
DisplayImage.cpp
#include 
#include 
using namespace cv;
int main(int argc, char** argv )
{
    if ( argc != 2 )
    {
        printf("usage: DisplayImage.out 
"); return -1; } Mat image; image = imread( argv[1], 1 ); if ( !image.data ) { printf("No image data
"); return -1; } namedWindow("Display Image", WINDOW_AUTOSIZE ); imshow("Display Image", image); waitKey(0); return 0; }

次はCMakeFileListsです.txt
cmake_minimum_required(VERSION 2.8)
project( DisplayImage )
find_package( OpenCV REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS} )
add_executable( DisplayImage DisplayImage.cpp )
target_link_libraries( DisplayImage ${OpenCV_LIBS} )

そしてコンパイルできます.
mkdir build
cd build
cmake ..
make 
./DisplayImage  ../lena.jpg

プログラムは実行できます.
この例はOpenCVの公式例です.
次に、find_package(OpenCV REQUIRED)の実行に成功すると、そのヘッダファイルパス、ライブラリファイルパスが割り当てられます.
OpenCV_INCLUDE_DIRS       

OpenCV_LIBS       

ヘッダファイルとライブラリファイルがあれば,自然とOpenCVを正常に参照できるようになった.
パッケージの汎用コース
実際にはfind_package()は、cmake packageの基準に合致する外部プロジェクトをスムーズに検索できます.find_pacage()メソッドの署名は次のとおりです.
find_package( [version] [EXACT] [QUIET] [MODULE]
             [REQUIRED] [[COMPONENTS] [components...]]
             [OPTIONAL_COMPONENTS components...]
             [NO_POLICY_SCOPE])


QUITEパラメータは,検索エラー時にメッセージ()の出力をブロックすることを指す.REQUIREDパラメータは、packageが見つからない場合にプロセスを終了することを意味します.
今XXXで探しているpackageの名前を表しますfind_pacakge(XXX REQUIRED)は、一連の変数を設定します.
XXX_FOUND          
XXX_INCLUDE_DIRS         
XXX_LIBRARIES         

例えば、cmakeは簡単にbzip 2を導入することができます.
find_package (BZip2)
if (BZIP2_FOUND)
    include_directories(${BZIP_INCLUDE_DIRS})
    target_link_libraries (test ${BZIP2_LIBRARIES})
endif (BZIP2_FOUND)

BZIP 2は一連の変数を定義し、意味は以下の通りである.
BZIP2_FOUND - system has BZip2
BZIP2_INCLUDE_DIR - the BZip2 include directory
BZIP2_LIBRARIES - Link these to use BZip2
BZIP2_NEED_PREFIX - this is set if the functions are prefixed with BZ2_
BZIP2_VERSION_STRING 

ここまで来て、私たちはfind_package()を把握して、私たちは本当に多くの場合cmakeコンパイルに対処することができます.
もちろん、1つのライブラリは複数のコンポーネントで構成され、cmakeはこれらのコンポーネントを単独で導入することができる.
find_package(Qt5 5.1.0 COMPONENTS Widgets Xml Sql)

Qt 5のWidgets Xml Sqlコンポーネントを導入した.
cmakeはどうして人工知能で一般的に依存ライブラリを自動的に見つけることができるのだろうか.
これ、次は詳しく説明します.
参照先:https://cmake.org/cmake/help/v3.0/manual/cmake-packages.7.html