2016-09-22 11 views
0

CMakeではほとんどのサードパーティのライブラリでは、インクルードディレクトリを指定する必要はありません...彼らは私のためにそれを世話しているようです。しかし、サードパーティーの図書館の中には、私の作品にその作品を載せているものもあります。CMakeを使用すると、なぜサードパーティのライブラリがインクルードディレクトリを自動的に表示するのですか?

私が間違っていることを示している第三者の図書館全体で見つかった違いはありますか?あるいは、CMakeは、サードパーティ製のライブラリが他のライブラリよりもあなたの手を保つようになっている、それほど構造化されていない環境ですか?ここで何が起こっているのですか?ベストプラクティス?

私はいくつかの例を挙げます。 OpenCVのは、物事が超簡単になり、私は彼らのインクルードディレクトリを言及することは必要:

set(OpenCV_DIR ${THIRD_PARTY_DIR}/OpenCV) 
find_package(OpenCV REQUIRED) 
... 
add_executable(${PROJECT_NAME} ${HEADER_FILES} ${SOURCE_FILES}) 
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS}) 

はしかし、Googleのプロトコルバッファinclude_directoriesを使用するために私を必要としない彼らのヘッダファイルを使用するためにコマンド:

set(CMAKE_PREFIX_PATH ${THIRD_PARTY_PROTOBUF_DIR}) 
find_package(Protobuf ${THIRD_PARTY_DIR}/protobuf-2.6.1) 
... 
include_directories(${PROTOBUF_INCLUDE_DIRS}) 
add_library(${PROJECT_NAME} SHARED ${HEADER_FILES} ${SOURCE_FILES}) 
target_link_libraries(${PROJECT_NAME} ${PROTOBUF_LIBRARIES}) 
+1

おそらく、最初のケースでは、OpenCVがシステム全体のパッケージとしてシステムにインストールされているため、ヘッダーは標準パスにあります。アンインストールしてもう一度試してみてください。私に教えてください、もしそうなら、答えにコメントをつけます。 ;-) – skypjack

+0

@skypjackの返信をありがとうが、私が使用しているOpenCVやその他のサードパーティのライブラリは、システム全体のレベルにインストールされていません。私はソースからサードパーティー(またはダウンロード済みのビルド済みバイナリ)を構築し、バイナリ/ヘッダをベースラインのThirdPartyフォルダに配置しました。インストールはありません。 –

答えて

1

target_include_directories()コマンドはCMake version 2.8.11と2013年5月に導入されました。これにより、ライブラリの開発者はパスを自己増殖させる可能性があります。

しかしtarget_include_directories()にすべてを変更するとCMakeの以前のバージョン(target_include_directories prior to 2.8.12?を参照)との後方互換性を壊すん。

これは主に、時間の経過とともに消滅すると思われる従来の問題です。

ほとんどの時間を、あなたはライブラリは、ライブラリのルートCMakeLists.txtの上部にcmake_minimum_required()ラインで使用しているかを見ることができます。例えば、 Protocol Buffers libraryの場合、CMakeLists.txtcmake_minimum_required(VERSION 2.8.12)に更新されており、現在はtarget_include_directories()(2015年7月のcommitを参照)を使用しています。

+0

'target_include_directories()'とそれに関連する 'target _...'コマンドの詳細については、[この記事](https://crascit.com/2015/02/02/cmake-target-dependencies/ )有用かもしれません(開示:私はそれを書いた)。この記事では、 'target_link_libraries()'に重点を置いていますが、includeディレクトリのようなものを、ターゲットにリンクしてリンクされたものによって自動的に取得されるメカニズムを示しています。 –

関連する問題