Укажите отдельные заголовочные файлы для CMake вместо полного каталога - PullRequest
0 голосов
/ 02 апреля 2020

Я искал inte rnet и не могу найти способ добавить отдельные включаемые файлы для моей сборки. Это не возможно? У меня очень мало опыта работы с Make, поэтому я не знаю, исходит ли это ограничение от Make.

Причина, по которой я этого хочу, заключается в том, что я пытаюсь протестировать унаследованную кодовую базу без изменения самого кода. Следовательно, я пытаюсь ввести макеты путем компиляции. Чтобы добиться этого, мне нужно, чтобы мой проект смешивал / сопоставлял файлы заголовков 'real' и 'mock'.

В качестве временного исправления я поместил файлы заголовков в отдельные папки, и это подтверждение концепции похоже на работу. Однако это решение кажется довольно уродливым?

PS Я использую gtest / gmock, и я не хочу использовать предложенную ими инъекцию зависимости стиля шаблона.

1 Ответ

0 голосов
/ 03 апреля 2020

Это не ограничение cmake или make, все компиляторы C ++ ищут заголовки из отсортированного списка папок, беря первый найденный заголовочный файл.

Вы можете изменить этот список с помощью папки include параметры и они будут искать в порядке их добавления. Это может быть очень трудно достичь, потому что порядок поиска отличается в зависимости от того, используют ли ваши старые заголовки #include "file.h" или #include <file.h>. Подробнее об этом читайте в руководстве к вашему компилятору или здесь .

Если в вашем устаревшем заголовке используется #include <>

Возможно, проще всего было бы создать собственную папку включения в папку сборки для каждой конфигурации и убедитесь, что эта папка имеет приоритет. Затем скопируйте только фиктивный заголовок в эту папку.

file(COPY test/mymock1.h DESTINATION mock/)
target_include_directories(
  mytest BEFORE
  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/mock
)

Если ваш устаревший заголовок использует #include ""

Вы облажались, потому что компилятор сначала ищет в физической папке, в которой находится другой заголовок Вы должны убедиться, что ваш фиктивный заголовок заменяет нематериальный заголовок в каталоге, вероятно, так же, как вы уже делаете.

...