CMake変数 CMAKE_LANG_IMPLICIT_INCLUDE_DIRECTORIES の詳細解説


CMAKE_LANG_IMPLICIT_INCLUDE_DIRECTORIES は、CMakeにおける重要な変数の1つであり、特定のプログラミング言語(例:C、C++、CUDA)でコンパイラがヘッダーファイルを暗黙的に検索するディレクトリを指定するために使用されます。これらのディレクトリは、CMakeのコンパイラコマンドラインに明示的に指定されることはありません。

目的

この変数の主な目的は、システムのインクルードディレクトリがユーザーのインクルードディレクトリと誤認されるのを防ぐことです。これは、C、C++、CUDAなどの言語において特に重要であり、標準ライブラリのヘッダーが上書きされるのを防ぎます。

構文

CMAKE_<LANG>_IMPLICIT_INCLUDE_DIRECTORIES <dir1> <dir2> ...
  • <dir1>, <dir2>, ... は、コンパイラがヘッダーファイルを検索するディレクトリのパスをリストします。
  • <LANG> は、変数が適用されるプログラミング言語を指定します。有効な値は、CCXXCUDAなどです。

CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES /usr/include
CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES /usr/include /c++/v14

この例では、Cコンパイラは /usr/include ディレクトリでヘッダーファイルを検索し、C++コンパイラは /usr/include/c++/v14 ディレクトリで検索します。

  • システムのインクルードディレクトリに加えて、プロジェクト固有のインクルードディレクトリを指定することもできます。これを行うには、target_include_directories() コマンドを使用します。
  • この変数は、CMakeのバージョンによって異なる動作をする場合があります。詳細は、CMakeの公式ドキュメントを参照してください。
  • CMAKE_LANG_IMPLICIT_INCLUDE_DIRECTORIES 変数は、CMakeの target_sources() などのコマンドで使用される COMPILE_DEFINITIONS 変数とは異なります。

メリット

  • プロジェクト固有のインクルードディレクトリを簡単に指定できます。
  • システムのインクルードディレクトリとユーザーのインクルードディレクトリを区別できます。
  • 標準ライブラリのヘッダーが上書きされるのを防ぎます。
  • すべてのコンパイラで同じように動作するとは限りません。
  • 誤った設定は、コンパイルエラーにつながる可能性があります。


cmake_minimum_required(VERSION 3.10)

project(myproject)

set(CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES "/usr/include")

add_executable(myprogram main.c)

この例では、C言語プロジェクトで CMAKE_LANG_IMPLICIT_INCLUDE_DIRECTORIES 変数を使用して、コンパイラがヘッダーファイルを検索するディレクトリを /usr/include に設定しています。

例2:C++プロジェクト

cmake_minimum_required(VERSION 3.10)

project(myproject)

set(CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES "/usr/include /c++/v14")

add_executable(myprogram main.cpp)

この例では、C++言語プロジェクトで CMAKE_LANG_IMPLICIT_INCLUDE_DIRECTORIES 変数を使用して、コンパイラがヘッダーファイルを検索するディレクトリを /usr/include/c++/v14 に設定しています。

例3:CUDAプロジェクト

cmake_minimum_required(VERSION 3.10)

project(myproject)

set(CMAKE_CUDA_IMPLICIT_INCLUDE_DIRECTORIES "/usr/local/cuda/include")

add_executable(myprogram main.cu)

この例では、CUDAプロジェクトで CMAKE_LANG_IMPLICIT_INCLUDE_DIRECTORIES 変数を使用して、コンパイラがヘッダーファイルを検索するディレクトリを /usr/local/cuda/include に設定しています。

  • システムのインクルードディレクトリに加えて、ユーザー定義のインクルードディレクトリを指定することもできます。
  • 上記の例は、プロジェクト固有のインクルードディレクトリを指定する方法を示していません。プロジェクト固有のインクルードディレクトリを指定するには、target_include_directories() コマンドを使用します。


システムのインクルードディレクトリを直接指定する

最も簡単な方法は、コンパイラのオプションを使用して、システムのインクルードディレクトリを直接指定することです。例として、gccコンパイラの場合、以下のコマンドを使用できます。

gcc -I /usr/include main.c -o myprogram

このコマンドは、コンパイラに /usr/include ディレクトリにあるヘッダーファイルを検索するように指示します。

target_include_directories() コマンドを使用する

CMakeでは、target_include_directories() コマンドを使用して、特定のターゲットに対してインクルードディレクトリを指定することができます。この方法は、プロジェクト固有のインクルードディレクトリを指定する場合に役立ちます。

add_executable(myprogram main.c)
target_include_directories(myprogram /path/to/myincludes)

この例では、myprogram ターゲットに対して /path/to/myincludes ディレクトリをインクルードディレクトリとして追加します。

CMAKE_INCLUDE_PATH 変数を使用する

CMAKE_INCLUDE_PATH 変数は、すべてのターゲットに対してグローバルなインクルードディレクトリを指定するために使用されます。この方法は、すべてのターゲットで共通のインクルードディレクトリを指定する場合に役立ちます。

set(CMAKE_INCLUDE_PATH "/path/to/myincludes")

add_executable(myprogram1 main1.c)
add_executable(myprogram2 main2.c)

この例では、すべてのターゲットに対して /path/to/myincludes ディレクトリをインクルードディレクトリとして追加します。

COMPILE_DEFINITIONS 変数を使用する

COMPILE_DEFINITIONS 変数は、コンパイラコマンドラインに追加されるマクロを定義するために使用されます。この方法は、ヘッダーファイルのパスを直接指定するマクロを定義する場合に役立ちます。

set(COMPILE_DEFINITIONS "-I/path/to/myincludes")

add_executable(myprogram main.c)

この例では、コンパイラコマンドラインに -I/path/to/myincludes マクロを追加し、コンパイラに /path/to/myincludes ディレクトリにあるヘッダーファイルを検索するように指示します。