cmake:Cannot specify include directories for imported target
1952 ワード
問題の説明
ソリューション
この問題は厳密にはバグではなく、cmakeのルール設計が不合理としか言いようがなく、imported targetに対して
解決策は、
cmake 3.11
幸いなことに、最新のcmake 3.11バージョンでは、この問題が正式に解決されました.CMake 3.11 Release Notesを参照してください.
すなわち、3.11以降のバージョンでは、
INTERFACE
オプション呼び出しtarget_include_directories
コマンドを使用してincludeフォルダをIMPORTED targetに追加すると、問題のエラーが表示されます.手順の説明:# imported target MyLib
add_library(MyLib SHARED IMPORTED)
set_property(TARGET MyLib PROPERTY IMPORTED_LOCATION mylib.dll)
set_property(TARGET MyLib PROPERTY IMPORTED_IMPLIB mylib.lib)
# INTERFACE include
target_include_directories(MyLib INTERFACE mylib/include)
# :
# Cannot specify include directories for imported target "MyLib".
ソリューション
この問題は厳密にはバグではなく、cmakeのルール設計が不合理としか言いようがなく、imported targetに対して
target_include_directories
コマンドを呼び出すことは許されず、cmake 3.11以前のすべてのバージョンに存在していた.以前から報告されています.https://cmake.org/Bug/view.php?id=15689 解決策は、
set_property
またはset_target_properties
でINTERFACE_INCLUDE_DIRECTORIES
の属性を変更することです.以下のようにします.# set_property INTERFACE_INCLUDE_DIRECTORIES
set_property(TARGET MyLib APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES mylib/include)
# set_target_properties :
set_target_properties(MyLib PROPERTIES INTERFACE_INCLUDE_DIRECTORIES mylib/include)
cmake 3.11
幸いなことに、最新のcmake 3.11バージョンでは、この問題が正式に解決されました.CMake 3.11 Release Notesを参照してください.
すなわち、3.11以降のバージョンでは、
target_*
シリーズcommandはimported target
シリーズのプロパティをINTERFACE_*
に設定することができます.target_include_directories(MyLib INTERFACE mylib/include)
という書き方は間違いなく書かれています.