2016-07-20 7 views
1

長年にわたる大規模なC++アプリケーションのコーディングにもかかわらず、私はfind_packageが中規模のCMakeプロジェクトでどのように動作するのか理解していません。依存するパッケージを自分自身で構築し、opencv、pcl、boostなどの大規模なシステムを単にシステムフォルダのどこかにインストールするのではなく、ソースを自分自身で構築します。 OpenCVやその他のオープンソースのアプリケーションを出荷した唯一の人で、NAntやSConsのようなメタ構築システムを使って大手ゲームプロジェクトで働いているが、 CMakeの動作に関する最も基本的なことを理解したり、これらの質問に答えるチュートリアルを見つけてください。CMakeを使用してアプリケーション固有のサブフォルダ内の依存関係を見つけよう

これまで、私は、作業フォルダを取得するまで、CMakeが苦情を申し立てるまで、foo_DIRの値を手作業で設定することによってfind_packageを制限することなく本質的にハッキングしました。

私は今作業している簡単な例を実行したいと思います。誰かが私が間違っていることを説明できることを願っています。

最初に、いくつかの前提があります: 私はMacOSとWindowsの両方で、理想的にはCMakeGUI経由ですべてをビルドしたいと考えています。 MacOSはXCodeProjectsをビルドし、WindowsはVisual Studio Solutionsをビルドする必要があります。

依存関係がある場合は、自分でコンパイルしたいので、デバッグシンボルがあり、依存関係のソースを変更できます(または少なくともデバッグすることができます)。 システムフォルダには、 macのsudo port install opencv/pclなどの使用。 私は複数のプロジェクトを持ち、1つのフォルダにプロジェクトとその依存関係を保つことを好みます。それは私が苦しむプロセスと混乱を説明するための任意の選択だが、具体的な例の目的のために は、私はこのプロジェクトを構築していたとします。これは私が意図的にそうここに並べ替えている依存関係を、一覧表示されます

https://github.com/krips89/opendetection

次のように私は、順番にそれらを取ることができる:\ SRC Windows上、およびMac上の〜\ SRC:

find_package(OpenCV REQUIRED) 
find_package(Eigen REQUIRED) 
find_package(Boost 1.40 COMPONENTS program_options REQUIRED) 
find_package(PCL REQUIRED) 
find_package(VTK REQUIRED) 

は、私は、単一のパスにダウンロードされ、構成されたこれらの依存関係のすべてを持っていると思います(のはCとしましょう単純化のために)、システムパスではありません。実際のフォルダはこのプロジェクトのサブフォルダであり、すべてのプロジェクトのサブフォルダはないとします。これにより、複数のプロジェクトを同じコンピュータに並べてインストールすることもできます。

は、一度にこの一歩を取る:

(1)私は、https://github.com/opencv/opencvから、3.1にタグを付け、フォルダopencv_buildフォルダに設定し、構築し、opencv_installにインストールするための同期をOpenCVのクローンを作成します。私はこれを何度もやってきました。それはかなり簡単です。 (2)上記と同じですが、固有名詞の場合(実際には何もしませんがテンプレートライブラリです。)eigen_install

Takingディレクトリには、ダウンロードされた依存関係の一連のフォルダが表示されます。どこ大会を想定して、ソースリポジトリがあり、その次_buildフォルダがCMakeGui内のフォルダ「バイナリをビルドする場所」。

$ ls 
boost_1_40_0 opencv opendetection_build 
eigen opencv-build opendetection_data 
eigen_build opencv_contrib pcl 
eigen_install opendetection 

いいすべてをこれまでのところ、今のはopendetectionを設定してみましょう、その溶液を生成していますopendetection_buildに入れて、〜/ srcフォルダ内ののペンデート検出の依存関係を見つけてください。、これは、私はopencv-buildとeigen-buildフォルダにopencvとeigenがあることを期待しています。私は明示的に私の〜/ srcフォルダの下に依存しているパッケージを探すためにCMakeのをお伝えしたいと思いますので、良いことだ

Could not find a package configuration file provided by "OpenCV" with any of the following names: 

OpenCVConfig.cmake 
opencv-config.cmake 

Add the installation prefix of "OpenCV" to CMAKE_PREFIX_PATH or set "OpenCV_DIR" to a directory containing one of the above files. If "OpenCV" provides a separate development package or SDK, be sure it has been installed. 

を:

OpenCVのはすぐに言って、予想通り、失敗します。質問:CMAKE_PREFIX_PATH =/users/foo/srcを使用して、特定のパスのすべてのサブパッケージを探していますか?

これに続いて、CMakeはOpenCV(good)を見つけ、OpenCV_DIR =/Users/foo/src/opencv-buildを設定します。

質問:私は、「インストール」それはOpenCVのビルドではないOpenCVのインストールフォルダ内のOpenCVのを見つけてはならない、CMAKE_INSTALL_PREFIXを使用してOpenCVの目標をインストール構築(OpenCVのインストールが行われていることを考えると

固有名詞に移動すると、私はeigenを設定してビルドして〜/ src/eigen-installにインストールしました。これはCMAKE_PREFIX_PATH(〜/ src)のサブフォルダであるため、見つかると思われます。私が理解していないことを誰かに説明することはできますか?具体的には、テンプレートライブラリのEigenと、CMakeが見つけると思っていたCMAKE_PREFIX_PATHの下に少なくとも3つのフォルダ(eigen、eigen_build、eigen_install)私はここで何か間違っていなければならないと思います。過去の経験から知っています。私は手でCMakeGUIのEIGEN_INCLUDE_DIRを手で設定し、ハッキングを続けることができますが、それは間違っているようです。

CMakeの基本的なプロジェクト構成と生成の使い方が明らかに分かりませんが、私がまだ存在していなければ、私のように将来の人々のためにこれを説明するWebページを書き留めておきます。誰にとっても分かりますが、私にとっては不透明です。私は実際に手動でBoost_INCLUDE_DirやFoo_INCLUDE_PATHなどを手動で設定するだけで、実際にCMakeを何年か使っていますが、これは正しい解決策ではありません。一般に、インクルード・パス、ライブラリ・パスなどのオプションを手動で設定してソリューションを生成するために、さまざまなパッケージを使用して数日を過ごした後、私はその解決策に取り掛かり、CMakeに再び触れないでください。しかし、私はsudo port install *を使ってプロジェクトの無作為バージョンを自分のグローバルシステムフォルダにインストールするのではなく、自分のプロジェクトの依存関係を制御したいという私の(確かに珍しいことではない)ユースケースについてfind_packageについて迷っています。

答えて

2

エラーメッセージに示すように、CMAKE_PREFIX_PATHのインストールプレフィックスに設定する必要があります。たとえば、パッケージがCMakeを使用してビルドされている場合、これはCMAKE_INSTALL_PREFIX変数の値です。パッケージがAutotoolsを使用してビルドされている場合、この値は--prefixの設定に使用されます。

CMakeはCMAKE_PREFIX_PATHのすべてのディレクトリを検索しません。そのため、パッケージを/users/foo/src/eigen-installにインストールした場合、/users/foo/srcという名前を付けることは無意味です。

代わりに、あなたは/users/foo/src/installすべて 3Dパーティのパッケージをインストールし、あなたの主なプロジェクトにCMAKE_PREFIX_PATHとしてそのパスを使用することができます。

+0

これは私がまだ聞いたことのない最も明確なコメントであり、その動作を完全に説明しています。しかし明確にするために、きれいに区切られたインストールで、私が望むものを実現する方法はありませんか?確かに、私は自分自身の "install"サブフォルダを作成することはできますが、なぜそれをやりたいのか理解できず、すべてをインストールしてインストールします。 VTK、opencv、pclなどのすべてのフォルダがダンプされているフォルダは非常に有名なフォルダです。そのため、たとえば、私がそれを更新することを選択した場合、サブパッケージを再構築する方法はありません。 –

+0

'きれいに分けられたインストールで、私が望むものを実現する方法はありませんか? - 可能ですが、その場合はすべてのインストール接頭辞を明示的に指定する必要があります。たとえば、すべてを 'CMAKE_PREFIX_PATH'にまとめることができます(この変数は実際には* list *かもしれません)。例えば、もしそれを更新することを選択した場合、サブパッケージを再構築する方法はありません。 - 通常、 'make uninstall'は、パッケージのファイルをインストールディレクトリからきれいに削除し、同じディレクトリ内の他のパッケージには触れません。したがって、単一の接頭辞をインストールしても、別々のパッケージを再構築することはできません。 – Tsyvarev

+0

ありがとうございます。一般的に、私は、彼らが書いたフォルダを吹き飛ばして信じているよりも少ないアンインストールスクリプトを書いてくれる人がいると信じています。 なぜOpenCV *が見つかったのかは分かりません(任意のサブフォルダにありますが)。これはOpenCVがfind_packageの動作をオーバーライドしたことを意味していますか? –

関連する問題