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>
は、変数が適用されるプログラミング言語を指定します。有効な値は、C
、CXX
、CUDA
などです。
例
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
ディレクトリにあるヘッダーファイルを検索するように指示します。