2013-05-11 3 views
3

Je compile et débogue mon petit projet avec msys et MinGW. Parfois, il compile très bien, mais environ 2/3 du temps imprime à la place ce message d'erreur:MinGW comportement ennuyeux, parfois compile, parfois non?

include/player.h:1:0: fatal error: can't create precompiled header 
bazglx.exe:invalid argument 
compilation terminated. 
make: *** [bazglx.exe] Error 1 

La ligne supérieure était en finnois si je devais traduire et il ne peut pas être identique à un anglais. Voici mon 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 [email protected] `sdl-config --cflags` $(CFLAGS) -c 

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

Parfois, il affiche même le message d'erreur, mais crée un exe corrompu. Il n'y a rien de spécial au début du fichier qu'il blâme et il a même blâmé les autres fichiers. C'est vraiment déroutant et ennuyeux et ça ralentit vraiment mes progrès.

+0

Je ne suis pas sûr de ce que cela signifie. Pouvez-vous vérifier votre espace disque et vous assurer que vous en avez assez? De même, si vous définissez la variable d'environnement 'LANG' sur la valeur' C', tous les messages seront imprimés en anglais. – MadScientist

+0

J'ai certainement assez d'espace, le programme n'est pas grand. Et j'ai reçu le message en anglais et c'est identique. – Mihq

+0

Je changerais 'SDL_CFLAGS: = $ (shell sdl-config --cflags)' et 'SDL_LDFLAGS: = $ (shell sdl-config --libs)'. Puis 'CFLAGS: = ... $ (SDL_CFLAGS)' et 'LDFLAGS: = ... $ (SDL_LDFLAGS)'. Ensuite, n'utilisez que les CFLAGS et les LDFLAGS sur la route. De plus, déplacez «-static-libgcc -static-libstdC++» vers «LDFLAGS» car ce sont vraiment des indicateurs pour lier, ** pas ** compilation, et supprimez «CFLAGS» de la phase de liaison, c'est-à-dire laissez seulement «LDFLAGS» sur le dernière ligne. –

Répondre

1

Cette règle est erroné:

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

Il provoque $(CC) à invoquaient la liste des fichiers d'en-tête comme entrées en plus des fichiers objets. Le compilateur essaiera de précompiler les en-têtes dans le fichier de sortie bazglx.exe (l'un après l'autre, en écrasant chaque fois le précédent), puis il liera les fichiers objet au fichier de sortie (en l'écrasant à nouveau) pour produire la sortie.

Vous souhaitez que votre étape de liaison implique uniquement les fichiers objet et les bibliothèques.

Je suppose que vous obtenez une erreur (et ne l'obtenez qu'occasionnellement) car quelque chose empêche GCC d'ouvrir le fichier bazglx.exe lorsqu'il essaie de précompiler include/player.h. Vous pouvez voir un effet similaire (mais avec probablement avec une autre erreur sur la deuxième ligne) si vous tapez la commande suivante en vous-même:

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

un antivirus est peut-être l'ouverture et le traitement des nouvelles instances répétées de bazglx.exe et parfois ce traitement n'est pas fait avant que GCC ne veut le recréer?

+1

C'est généralement une bonne idée de dire à votre antivirus de ne pas analyser les fichiers dans les dossiers où vous compilerez votre propre code. L'antivirus qui analyse vos programmes nouvellement compilés a peu ou pas d'avantages, il ralentit simplement les choses et provoque parfois des problèmes. Une fois, j'ai réussi à obtenir un faux positif dans un de mes programmes, et l'antivirus avait été dit de supprimer silencieusement de tels fichiers - j'ai passé un certain temps à essayer de comprendre pourquoi je compilais mais il n'y avait pas de binaire. – Steve314

Questions connexes