Я компилирую и отлаживаю свой маленький проект с помощью msys и MinGW. Иногда он компилируется просто отлично, но примерно 2/3 времени вместо этого печатает это сообщение об ошибке:
include/player.h:1:0: fatal error: can't create precompiled header
bazglx.exe:invalid argument
compilation terminated.
make: *** [bazglx.exe] Error 1
Самая верхняя строка была на финском языке, поэтому мне пришлось перевести ее, и она может не совпадать с английской. Вот мой make-файл:
CC = g++
IDIR = include
ODIR = obj
SDIR = srcCFLAGS = -I $(IDIR) -static-libgcc -static-libstdc++ -Wall -ggdb
LFLAGS = -lSDL_gfx
_OBJ = main.o init.o mainloop.o render.o map.o player.o
_DEPS = init.h mainloop.h render.h map.h player.h
OBJ = $(patsubst %.o, $(ODIR)/%.o, $(_OBJ))
DEPS = $(patsubst %.h, $(IDIR)/%.h, $(_DEPS))
$(ODIR)/%.o:$(SDIR)/%.cpp
$(CC) $^ -o $@ `sdl-config --cflags` $(CFLAGS) -c
bazglx.exe:$(OBJ) $(DEPS)
$(CC) $^ -o $@ `sdl-config --libs --cflags` $(CFLAGS) $(LFLAGS)
Иногда он даже отображает сообщение об ошибке, но создает испорченный exe. Там нет ничего особенного в начале файла, который он обвиняет, и он даже обвинял другие файлы. Это действительно сбивает с толку и раздражает, и действительно замедляет мой прогресс.
Это правило неверно:
bazglx.exe:$(OBJ) $(DEPS)
$(CC) $^ -o $@ `sdl-config --libs --cflags` $(CFLAGS) $(LFLAGS)
Это приводит $(CC)
вызываться со списком заголовочных файлов в качестве входных данных в дополнение к объектным файлам. Компилятор попытается предварительно скомпилировать заголовки в выходной файл bazglx.exe
(один за другим, каждый раз перезаписывая предыдущий), затем он связывает объектные файлы в выходной файл (перезаписывая его снова) для получения выходных данных.
Вы хотите, чтобы ваш шаг связывания включал только объектные файлы и библиотеки.
Я подозреваю, что вы получаете ошибку (и только иногда ее), потому что что-то мешает GCC открыть bazglx.exe
файл, когда он пытается прекомпилировать include/player.h
, Вы можете увидеть аналогичный эффект (хотя, возможно, с другой ошибкой во второй строке), если вы введете в себя следующую команду:
g++ include/player.h -o some-non-directory/bazglx.exe
Может быть, антивирус открывает и обрабатывает повторяющиеся новые экземпляры bazglx.exe
и иногда эта обработка не выполняется до того, как GCC захочет воссоздать ее?
Других решений пока нет …