ヘッダーのみの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で生成されたプロジェクトのソースを確認できないため、ここでは完全には機能しないようです。それがバグなのか、それとも間違っているのか、またはこれを行うための好ましい方法があるのかどうかはわかりません。
更新: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ファイルからのみターゲット言語を推論できないと文句を言うからです。
これは、最近の 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)
あなたが探しているのは、cmakeの "include_directories"コマンドを使用してインクルードディレクトリを追加することだけだと思います。
これを行うときに、あなたが制御できないサードパーティのツールである場合は、「SYSTEM」フラグも追加します。
したがって、コマンドは次のようになります。
include_directories(SYSTEM ${GTEST_INCLUDE_DIRS})