MinGW烦人的行为,有时编译,有时不是?

时间:2013-05-11 22:45:32

标签: c++ gcc makefile mingw msys

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

最上面的一行是芬兰语,所以我不得不翻译它,它可能与英语不同。这是我的makefile:

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。它归咎于文件的开头并没有什么特别之处,甚至还指责其他文件。这真令人困惑和烦恼,真的会减缓我的进步。

1 个答案:

答案 0 :(得分: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想要重新创建它之前没有完成处理?