Подтвердить что ты не робот

Как заставить GCC искать заголовки в каталоге до текущего каталога исходного файла?

Я использую предварительно скомпилированные заголовки GCC в моем проекте с многоадресной сборкой, но все происходит, когда я пытаюсь поместить его в каталог, отличный от текущего исходного каталога.

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

GCC ищет текущий каталог для двойной кавычки, перед его поисковым путем. Я могу обойти это с помощью опции -I- (например, -Ipch_dir.i686 -I-), поэтому поиск в предварительно скомпилированном каталоге заголовков выполняется перед текущим каталогом, но этот параметр устарел. GCC предлагает использовать -iquote, но он не имеет такого же эффекта, как -I-.

Итак, вопрос в том, как заставить его работать, не меняя все прекомпилированные заголовки, включая директивы в угловые скобки и используя устаревший переключатель GCC?

4b9b3361

Ответ 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 в исходный заголовок после сборки предварительно скомпилированного).