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

Posted

技术标签:

【中文标题】MinGW 烦人的行为,有时编译,有时不编译?【英文标题】:MinGW annoying behavior, sometimes compiles, sometimes not? 【发布时间】:2013-05-11 22:45:31 【问题描述】:

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

【问题讨论】:

我不确定这意味着什么。你能检查你的磁盘空间并确保你有足够的空间吗?此外,如果您将环境变量 LANG 设置为值 C,它将以英文打印所有消息。 我当然有足够的空间,程序不大。我收到了英文信息,它是相同的。 我会改为SDL_CFLAGS := $(shell sdl-config --cflags)SDL_LDFLAGS := $(shell sdl-config --libs)。然后CFLAGS := ... $(SDL_CFLAGS)LDFLAGS := ... $(SDL_LDFLAGS)。然后在路上只使用CFLAGSLDFLAGS。此外,将-static-libgcc -static-libstdc++ 移动到LDFLAGS,因为这些确实是用于链接的标志,不是编译,并从链接阶段删除CFLAGS,即只在最后一行留下LDFLAGS 最后,更喜欢:= 而不是=,因为它是您大多数时候想要的。请参阅制作文档以了解它们之间的差异。 = 有很多陷阱。最后但同样重要的是,考虑学习并切换到一些现代构建系统,例如 CMake,而不是使用裸 Make。离开 make 到 80 年代 - 90 年代,今天人们不再使用裸 Make 构建复杂的软件。 【参考方案1】:

这条规则是错误的:

bazglx.exe:$(OBJ) $(DEPS)
    $(CC) $^ -o $@ `sdl-config --libs --cflags` $(CFLAGS) $(LFLAGS)

它会导致$(CC) 被调用,除了目标文件之外,还使用头文件列表作为输入。编译器会尝试将头文件预编译到输出文件bazglx.exe(一个接一个,每次覆盖之前的一个),然后它将目标文件链接到输出文件(再次覆盖它)以产生输出.

您希望链接步骤仅涉及目标文件和库。

我怀疑您遇到了一个错误(并且只是有时),因为在尝试预编译 include/player.h 时,某些东西阻止了 GCC 打开 bazglx.exe 文件。如果您自己键入以下命令,您可以看到类似的效果(尽管可能在第二行出现不同的错误):

g++ include/player.h -o some-non-directory/bazglx.exe

也许防病毒软件正在打开并处理重复的 bazglx.exe 新实例,有时在 GCC 想要重新创建它之前没有完成该处理?

【讨论】:

告诉您的防病毒软件不要扫描您将编译自己的代码的文件夹中的文件通常是个好主意。扫描您新编译的程序的防病毒软件几乎没有任何好处,它只会减慢速度并偶尔会导致问题。我曾经设法在我的一个程序中获得误报,并且防病毒软件被告知要静默删除此类文件 - 我花了很长时间试图弄清楚我为什么要编译但没有二进制文件。

以上是关于MinGW 烦人的行为,有时编译,有时不编译?的主要内容,如果未能解决你的问题,请参考以下文章

QT用VS还是MINGW编译好,有啥区别

用mingw32 gcc 一编译就出一大堆错误,应该怎么解决

codeblocks编译器

子类中的委托方法有时不使用 Swift 5 编译器调用

OpenGL 着色器有时可以编译,有时不能

Qt使用MinGW编译,如何忽略警告