Ответ 1
Хорошо, мое редактирование решило проблему: размещение символа -
перед include
скрывает сообщения об ошибках, исходящие из поколения зависимостей.
Примечание для более поздних версий: не пытайтесь перехитрить Make.
У меня есть этот проект на С++, который компилируется с использованием 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
для каждого файла зависимостей, который должен быть включен (поэтому мы поставили -
в первую очередь).
Любое решение?
Хорошо, мое редактирование решило проблему: размещение символа -
перед include
скрывает сообщения об ошибках, исходящие из поколения зависимостей.
Примечание для более поздних версий: не пытайтесь перехитрить Make.
Это созданный Makefile, возможно, с помощью какого-то инструмента, такого как CMake, который скрывает вывод компилятора, подобный этому:
gcc -o a.out a.c 2>&1 > /dev/null
Если вы не знаете, что происходит, это звучит, как хорошая идея, полностью пересмотреть систему сборки, попробуйте начать заново.