Убедитесь, что #include использует заголовок, созданный с помощью ExternalProject_Add cmake, а не системный эквивалент - PullRequest
0 голосов
/ 04 января 2019

Я добавил zlib в проект CMake так:

project(zlib)

include(ExternalProject)

# set some variables

ExternalProject_Add(zlib_proj # boring stuff omitted ...
                   )

add_library(zlib SHARED IMPORTED GLOBAL)
add_dependencies(zlib zlib_proj)
set_target_properties(zlib PROPERTIES
  # ...
  INTERFACE_INCLUDE_DIRECTORIES "${INCLUDE_DIR}"
)

Я решил построить zlib в своем проекте CMake вместо использования системы zlib.so, чтобы гарантировать, что один и тот же zlib используется независимо от того, где проект клонирован и собран (этот выбор не для обсуждения).

В другом месте, другая цель связывается с zlib до target_link_libraries. В исходном файле в этой зависимой цели я #include <zlib.h>. Он прекрасно компилируется, и я вполне уверен, что zlib.so также правильно собран и связан. Тем не менее, <zlib.h> также доступна из системы. Возможно, я мог бы вручную проверить, что я включаю <zlib.h> в ${INCLUDE_DIR}, добавив фиктивную переменную и используя ее в зависимом исходном файле, но я действительно хотел бы автоматически утверждать, что правильный файл включен во время любой компиляции на любом машина. Определения того, что включенный zlib.h живет где-то в каталоге сборки CMake, вероятно, достаточно.

Я думаю, CheckIncludeFileCXX не совсем решает проблему; Мне нужно проверить, какой zlib.h на самом деле включен в конкретный исходный файл. Знание того, что мои локальные данные zlib.h могут быть включены вообще, безусловно, является обязательным условием, но это не полностью отвечает на мой вопрос.

1 Ответ

0 голосов
/ 04 января 2019

Этого можно добиться, заставив компилятор сгенерировать файлы зависимостей для необходимого файла .cpp, а затем добавив пользовательский шаг сборки, который проверяет путь zlib.h с помощью grep или любым другим способом. Итак, вкратце (так как я не эксперт по CMake):

  • Добавьте -MD -MF к флагам C / C ++ (или, возможно, CMake имеет какой-то хороший способ включить генерацию зависимостей или, может быть, даже делает это по умолчанию - не совсем уверен).
  • Добавьте add_custom_command (или еще раз, может быть, есть что-то более приятное), чтобы проверить путь <zlib.h> в сгенерированном файле зависимостей.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...