CMake ошибка: обнаружен относительный путь при оценке, включают в себя каталоги - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь понять, почему 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, так как все они определены в одном и том же проект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...