cmake:Cannot specify include directories for imported target


問題の説明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_propertiesINTERFACE_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)という書き方は間違いなく書かれています.