Как заставить GCC искать заголовки в каталоге до текущего каталога исходного файла?
Я использую предварительно скомпилированные заголовки GCC в моем проекте с многоадресной сборкой, но все происходит, когда я пытаюсь поместить его в каталог, отличный от текущего исходного каталога.
Файл включен в двойные кавычки, и он работает, если я меняю его на угловые скобки, но проблема в том, что у меня есть много других проектов, которые используют одно и то же имя с предварительно скомпилированным заголовком, поэтому меняя все их на угловые скобки нежелательно, так как это может создать неоднозначность в отношении того, какой заголовок должен включать в сборку Visual Studio те же файлы.
GCC ищет текущий каталог для двойной кавычки, перед его поисковым путем. Я могу обойти это с помощью опции -I-
(например, -Ipch_dir.i686 -I-
), поэтому поиск в предварительно скомпилированном каталоге заголовков выполняется перед текущим каталогом, но этот параметр устарел. GCC предлагает использовать -iquote
, но он не имеет такого же эффекта, как -I-
.
Итак, вопрос в том, как заставить его работать, не меняя все прекомпилированные заголовки, включая директивы в угловые скобки и используя устаревший переключатель GCC?
Ответы
Ответ 1
Я нашел обходное решение.
-
Создайте предварительно скомпилированный заголовок под другим именем. Например, заголовок a.h
, исходный предварительно скомпилированный заголовок pchdir.i686/a.h.gch
, постройте его как
gcc a.h -o pchdir.i686/a-precompiled.h.gch
-
Используйте переключатель GCC -include
, чтобы убедиться, что переименованный заголовок включен раньше всего (еще до исходного a.h
), например
gcc -Ipchdir.i686 -include a-precompiled.h <other arguments> <source>
-
Окончательный порядок включения в исходном файле будет: a-precompiled.h.gch
, a.h
, который я проверил с помощью -H
. Исходный заголовок включен, но на самом деле не обрабатывается, потому что предварительно скомпилированный заголовок имеет одинаковые атрибуты include (проверяется также путем вставки #error
в исходный заголовок после сборки предварительно скомпилированного).