web-dev-qa-db-ja.com

CMakeを設定してヘッダーのみのプロジェクトを生成するにはどうすればよいですか?

ヘッダーのみのC++(またはC)ライブラリプロジェクトをセットアップしたいのですが、クリーンな方法が見つかりません。

いくつか検索したところ、コンパイル可能なソースファイルが必要なため、add_libraryを使用して通常のライブラリを設定することはできません。これを行う方法は、代わりにadd_custom_targetを使用することです。

# Get all headers (using search instead of explicit filenames for the example)
file( GLOB_RECURSE XSD_HEADERS 
    *.hxx
)
add_custom_target( libsxsd SOURCES ${XSD_HEADERS} )

しかし、VS2010で生成されたプロジェクトのソースを確認できないため、ここでは完全には機能しないようです。それがバグなのか、それとも間違っているのか、またはこれを行うための好ましい方法があるのか​​どうかはわかりません。

40
Klaim

更新:CMakeには、ヘッダーのみのプロジェクトに最適なINTERFACEと呼ばれるライブラリターゲットがすぐに含まれます。この機能は現在masterブランチにあります。 参考

add_custom_targetコマンドを使用して、私(VS2010)の作品を提案します。ファイルは私のプロジェクト内にきちんとリストされていますが、カスタムターゲットで「追加のインクルードディレクトリ」を定義できないという欠点があります。代わりに、私は今以下を使用します:

add_library(HEADER_ONLY_TARGET STATIC test1.hpp test2.hpp)
set_target_properties(HEADER_ONLY_TARGET PROPERTIES LINKER_LANGUAGE CXX)

これにより、ヘッダーのみのプロジェクトがダミーのアーカイブターゲットとして設定されます。心配しないでください。実際にビルドしてみても、バイナリは生成されません(少なくともVS2010およびXcode 4では)。コマンドset_target_propertiesが存在するのは、CMakeが.hppファイルからのみターゲット言語を推論できないと文句を言うからです。

26
Frederik Aalund

これは、最近の Interface Library 機能を使用して実行できます。

add_library(mylib INTERFACE)
target_include_directories(mylib INTERFACE my_include_dir1 my_include_dir2)

これにより、ソースファイルのないライブラリターゲットが作成され、ターゲットの INTERFACE_INCLUDE_DIRECTORIES プロパティにインクルードディレクトリが追加されます。つまり、このライブラリにリンクするターゲットは、これらのディレクトリをインクルードパス(-I)ビルド時。

たとえば、実行可能なターゲットでライブラリを使用するには、次のようにします。

add_executable(myexec ${MY_SOURCES})
target_link_libraries(myexec mylib)
8
Samuel Peter

あなたが探しているのは、cmakeの "include_directories"コマンドを使用してインクルードディレクトリを追加することだけだと思います。

これを行うときに、あなたが制御できないサードパーティのツールである場合は、「SYSTEM」フラグも追加します。

したがって、コマンドは次のようになります。

include_directories(SYSTEM ${GTEST_INCLUDE_DIRS})
1
Keith P