Я пытаюсь понять, почему CMake жалуется в данной ситуации.
У меня есть модуль A в зависимости от модуля B, который зависит от модуля C.
Модуль C является подкаталогом модуля B, и соответствующие части CMakeLists.txt каждого модуля такие, как показано здесь:
модуль А делает:
add_library(A STATIC "")
target_include_directories(A PRIVATE
$<TARGET_PROPERTY:B,INCLUDE_DIRECTORIES>
)
модуль B делает:
add_library(B static "")
set(some_dirs
C
)
foreach(DIR ${some_dirs})
add_subdirectory(${DIR})
target_link_libraries(B PUBLIC ${DIR})
endforeach(DIR)
модуль C делает:
add_library(C STATIC "")
target_include_directories(C
PUBLIC
$<TARGET_PROPERTY:OtherLib,INCLUDE_DIRECTORIES>
PRIVATE
)
Существует исполняемый файл, который связывается с модулем A.
Причиной использования TARGET_PROPERTY: INCLUDE_DIRECTORIES является то, что я перемещаю большой проект с множеством циклических зависимостей из монолитного исполняемого файла в другой с различными библиотеками. Вначале я пытался создать модули, а затем разорвать круговые зависимости. Поэтому в этом примере вместо target_link_libraries
для зависимости я использую target_include_directories
со свойством INCLUDE_DIRECTORIES для зависимостей. Я надеюсь, что это имеет смысл.
Я получаю ошибку в описанной выше ситуации, которая включает:
Configuring done
Failed to parse JSON from CMake server.
Failed to parse JSON from CMake server.
CMake Error in A/CMakeLists.txt:
Found relative path while evaluating include directories of
"A":
, за которым следуют некоторые символы мусора и еще несколько "Не удалось проанализировать JSON из строк сервера CMake.
Однако, когда я изменяю модуль C следующим образом:
add_library(C STATIC "")
target_include_directories(C
PUBLIC
PRIVATE
$<TARGET_PROPERTY:OtherLib,INCLUDE_DIRECTORIES>
)
Ошибки генерации исчезают.
OR
Если я оставляю модуль C таким, каким он был изначально, но заменяю модуль B на этот (т.е. не связываюсь с C):
add_library(B static "")
set(some_dirs
C
)
foreach(DIR ${some_dirs})
add_subdirectory(${DIR})
# target_link_libraries(B PUBLIC ${DIR})
endforeach(DIR)
и А к этому:
add_library(A STATIC "")
target_include_directories(A PRIVATE
$<TARGET_PROPERTY:B,INCLUDE_DIRECTORIES>
$<TARGET_PROPERTY:C,INCLUDE_DIRECTORIES>
)
Тогда ошибки генерации также исчезнут.
Я не совсем понимаю, почему CMake считает, что существуют относительные пути, когда модуль C использует включение PUBLIC против PRIVATE. Я также не понимаю, почему проблема исчезает, когда я удаляю C как зависимость B. Я понимаю, что целевые объекты IMPORTED не могут иметь относительные пути, но ни одна из моих целевых задач не IMPORTED, так как все они определены в одном и том же проект.