web-dev-qa-db-ja.com

CMakeでインクルードディレクトリを正しく追加する方法

約1年前、私は CMakeのヘッダ依存関係 について尋ねました。

私は最近問題がCMakeがそれらのヘッダファイルをプロジェクトの external とみなすことであることに気づいたことに気づきました。少なくとも、Code :: Blocksプロジェクトを生成するとき、ヘッダーファイルはプロジェクト内には現れません(ソースファイルは現れます)。それゆえ、CMakeはそれらのヘッダがプロジェクトの external であると考えており、それらを依存して追跡していないようです。

CMakeチュートリアルのクイックサーチはinclude_directoriesだけを指していましたが、それは私が望むことをしているようには見えません….

特定のディレクトリに含まれるヘッダが含まれていること、およびそれらのヘッダが生成されたMakefileによって追跡されるべきであることをCMakeに知らせる適切な方法は何ですか?

185
Matthieu M.

2つのことをしなければなりません。

最初に含めるディレクトリを追加します。

target_include_directories(test PRIVATE ${YOUR_DIRECTORY})

target_include_directoriesをサポートしていない非常に古いCMakeバージョン(2.8.10以前)で立ち往生している場合は、代わりに従来のinclude_directoriesを使用することもできます。

include_directories(${YOUR_DIRECTORY})

次に、現在のターゲットのソースファイルのリストにヘッダーファイルを追加する必要があります。次に例を示します。

set(SOURCES file.cpp file2.cpp ${YOUR_DIRECTORY}/file1.h ${YOUR_DIRECTORY}/file2.h)
add_executable(test ${SOURCES})

このようにして、ヘッダファイルはMakefile、および生成されたVisual Studioプロジェクトに生成された場合はその中にも依存関係として表示されます。

いくつかのターゲットに対してこれらのヘッダファイルを使用する方法:

set(HEADER_FILES ${YOUR_DIRECTORY}/file1.h ${YOUR_DIRECTORY}/file2.h)

add_library(mylib libsrc.cpp ${HEADER_FILES})
target_include_directories(mylib PRIVATE ${YOUR_DIRECTORY})
add_executable(myexec execfile.cpp ${HEADER_FILES})
target_include_directories(myexec PRIVATE ${YOUR_DIRECTORY})
204
SirDarius

まず、include_directories()を使用して、CMakeにディレクトリを-Iとしてコンパイルコマンドラインに追加するように指示します。次に、add_executable()またはadd_library()呼び出しでヘッダーを一覧表示します。

例として、あなたのプロジェクトのソースがsrcにあり、includeからのヘッダが必要な場合は、次のようにすることができます。

include_directories(include)

add_executable(MyExec
  src/main.c
  src/other_source.c
  include/header1.h
  include/header2.h
)
57
Angew

CMakeは、Makefileを作成する他の方法(makeやqmakeなど)と比較すると、スクリプト言語に似ています。 Pythonのようにそれほどクールではありませんが、それでもまだです。

さまざまなオープンソースプロジェクトで人々がどのようにディレクトリをインクルードしているかを見ると、 "適切な方法"のようなものはありません。しかし、それを行うには2つの方法があります。

  1. Crude include_directories は、現在のプロジェクトと、一連の add_subdirectory コマンドを介して追加する他のすべての子プロジェクトにディレクトリを追加します。時々人々はそのようなアプローチが遺産であると言う。

  2. もっと洗練された方法は target_include_directories を使うことです。不必要な継承やさまざまなインクルードディレクトリの衝突なしに、特定のプロジェクト/ターゲット用のディレクトリを追加することができます。微妙な設定でも実行でき、このコマンドに次のマーカーの1つを追加することもできます。

_ private _ - この指定されたビルドターゲットにのみ使用

_ public _ - 指定したターゲットおよびこのプロジェクトとリンクしているターゲットに使用します。

_ interface _ - 現在のプロジェクトとリンクしているターゲットにのみ使用する

シモンズ:

  1. どちらのコマンドでも、ディレクトリをSYSTEMとしてマークして、指定したディレクトリに警告が含まれるのは自分の業務ではないというヒントを与えることができます。

  2. 同様の答えが他のコマンドのペア target_compile_definitions / add_definitionstarget_compile_options / CMAKE_C_FLAGS です。

10
bruziuz

私は同じ問題を抱えていました。

私のプロジェクトディレクトリはこんな感じでした:

    --project
    ---Classes
    ----Application
    -----.h and .c files
    ----OtherFolders
    --main.cpp

そして私がかつてそれらのすべてのフォルダーにファイルを含めていたもの:

    file(GLOB source_files
            "*.h"
            "*.cpp"
            "Classes/*/*.cpp"
            "Classes/*/*.h"
    )

    add_executable(Server ${source_files})

そしてそれは完全にうまくいった。

include_directories("/your/path/here")を追加してください。

これは、-I/your/path/here/オプションを付けてgccを呼び出すのと似ています。

パスを二重引用符で囲むようにしてください。他の人々はそれについて言及しなかった、そしてそれは私を2日間立ち往生させた。それで、この答えはCMakeに非常に不慣れで非常に混乱している人々のためのものです。

2
off99555