Сделать/gcc cryptic error 2: как получить дополнительную информацию?

У меня есть этот проект на С++, который компилируется с использованием Makefile, а иногда, когда (моя догадка) есть некоторые недостающие, я получаю загадочное сообщение об ошибке "ошибка 2", и процесс make останавливается.
Я подозреваю, что недостающее включает, потому что это уже третий раз, когда я включал несуществующий файл заголовка.

Он выглядит следующим образом:

---- Build tmp/foo.o ----
---- Build tmp/bar.o ----
---- Build tmp/toto.o ----
---- Build tmp/tata.o ----
make: *** [build_Project] Error 2

Это сводит меня с ума, потому что даже при использовании подробных команд (где отображается каждый вызов g++), я ничего не вижу.
Я ожидал, что парень выбросит некоторые ошибочные сообщения типа "не может найти заголовок X" или "undefined ссылку на Y", но там ничего нет.

Мои параметры компиляции для gcc -O0 -Wall -Werror -Wno-write-strings -fno-rtti -fno-exceptions, если это помогает.

Ah, и мы используем трюк Makefile для включения зависимостей:

ifneq ($(strip $(DEPENDS)),)
ifneq ($(MAKECMDGOALS),clean)
-include $(DEPENDS)
endif
endif

(см. здесь и здесь для получения дополнительной информации)

Хотя это документированный материал, я подозреваю, что моя проблема имеет какое-то отношение к включению этих зависимостей.

Если вы уже наткнулись на эту проблему, не стесняйтесь комментировать это...

Спасибо заранее.

изменить Хорошо, после небольшого воспроизведения, подавление - перед -include $(DEPENDS) дает мне дополнительную информацию (makefile останавливается на отсутствующем включенном файле).

make[1]: *** No rule to make target « foo.h », necessary for « tmp/bar.d ». Stop.

Теперь недостатком является то, что когда я запускаю make в первый раз, я получаю сообщение missing bar.d file для каждого файла зависимостей, который должен быть включен (поэтому мы поставили - в первую очередь). Любое решение?

Ответы

Ответ 1

Хорошо, мое редактирование решило проблему: размещение символа - перед include скрывает сообщения об ошибках, исходящие из поколения зависимостей.

Примечание для более поздних версий: не пытайтесь перехитрить Make.

Ответ 2

Это созданный Makefile, возможно, с помощью какого-то инструмента, такого как CMake, который скрывает вывод компилятора, подобный этому:

gcc -o a.out a.c 2>&1 > /dev/null

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