3

我正在用 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

最上面一行是芬兰语,所以我不得不翻译它,它可能与英语不一样。这是我的生成文件:

CC = g++

IDIR = include
ODIR = obj
SDIR = src


CFLAGS = -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。它归咎于文件的开头没有什么特别之处,它甚至归咎于其他文件。这真的很令人困惑和烦人,并且真的减慢了我的进步。

4

1 回答 1

1

这个规则是错误的:

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 想要重新创建它之前没有完成处理?

于 2013-05-15T05:03:41.700 回答