MinGW раздражает поведение, иногда компилирует, иногда нет?

Я компилирую и отлаживаю свой маленький проект с помощью 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. Там нет ничего особенного в начале файла, который он обвиняет, и он даже обвинял другие файлы. Это действительно сбивает с толку и раздражает, и действительно замедляет мой прогресс.

3

Решение

Это правило неверно:

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 захочет воссоздать ее?

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]