фон
У меня есть большой Makefile
проект я работаю, на котором я хотел бы немного прибраться. Он создает несколько десятков подпроектов, каждый из которых содержит около 100 .cpp
и .h
файлов. Я настроил его так, чтобы он смог построить debug
и release
для нескольких операционных систем (Linux, OSX/Mac, QNX и т. Д.) И для нескольких архитектур (x86/i386
, x64/amd64
, armhf
, arm64/aarch64
). Это потому, что это массивный проект, и единственный способ быстро его построить - параллельно с несколькими целями инструментов.GCC - Несколько скомпилированные заголовки и конкретные пути
У меня есть правило, согласно которому все проекты подчиняются тому, что хранит промежуточные объекты (то есть: .o
файлов) во временных файлах при создании. Итак, здание test.c
для Linux, arm64, режим выпуска; построим объектный файл в следующем подкаталоге в рабочем каталоге:
.tmp/Linux/arm64/release
Вопросы
Эта функция работает без проблем в моих сборках, но с этой установкой, я не могут правильно использовать предварительно скомпилированные заголовки (то есть: .GCH
файлов) с GCC. С моей установкой у меня есть пара stdafx.h
/stdafx.cpp
. Используя GCC, я могу создать файл stdafx.h.gch
достаточно легко. Тем не менее, проект, похоже, использует его (что ускоряет сборку), если файл находится на том же пути, что и исходные файлы. Если предварительно скомпилированный заголовок является промежуточным объектом пути промежуточного объекта (то есть: .tmp/Linux/arm64/release
), он не обнаруживается и не используется. Даже если я явно добавлю путь include к пути промежуточных объектов, который будет содержать файл gch
, он терпит неудачу. Включение полного пути к имени файла приводит к тому, что он рассматривается как недопустимый сценарий компоновщика и игнорируется.
Итак, первым моим решением было сделать правило, чтобы заставить все сборки OS/arch ждать первоначального предварительно скомпилированного генерации заголовков, а не строить gch
на основе каждой ОС/арки. Тем не менее, если я строй gch
с настройками режима релиза и попыткой make
отладкой сборки, я получаю следующее предупреждение:
warning: stdafx.h.gch: created with -gnone, but used with -gdwarf-2
Первого, я не знаю, если это имеет серьезные последствия для моего телосложения, и второго , разные операционные системы могут передавать разные фреймы определения времени компиляции для генерации gch
, поэтому, насколько я могу судить, это не вариант использования «один размер подходит всем».
Вопрос
Как я могу обойти эту проблему, так что предкомпилированный заголовок находится в другом месте, кроме $PWD
и он может быть обнаружен с помощью GCC? В настоящее время я использую gcc v5.3.1.
спасибо.
Вы можете разместить один из линий компиляции вы пытались получить GCC, чтобы увидеть 'gch', когда он находится в другой папке? – user657267
@ user657267 Конечно: 'INC + = .tmp/$ {OS_TYPE}/$ {CPU_TYPE}/$ {REL_TYPE}'. 'gcc $ {INC} -c $ {INPUT} -o $ {OUTPUT}'. Не самый полезный, но мой 'Makefile' очень многословный и перекликается с путями' include', которые используются во время сборки, и я могу подтвердить, что заголовки обычно разрешаются с этого пути, за исключением файлов '.gch'. – DevNull
Извините, я имел в виду, что на самом деле он был расширен до того, как он был выполнен. – user657267