【发布时间】: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)。然后在路上只使用CFLAGS和LDFLAGS。此外,将-static-libgcc -static-libstdc++移动到LDFLAGS,因为这些确实是用于链接的标志,不是编译,并从链接阶段删除CFLAGS,即只在最后一行留下LDFLAGS。 -
最后,更喜欢
:=而不是=,因为它是您大多数时候想要的。请参阅制作文档以了解它们之间的差异。=有很多陷阱。最后但同样重要的是,考虑学习并切换到一些现代构建系统,例如 CMake,而不是使用裸 Make。离开 make 到 80 年代 - 90 年代,今天人们不再使用裸 Make 构建复杂的软件。
标签: c++ gcc makefile mingw msys