2009-11-18 5 views
0

J'ai récemment mis à jour mon installation d'Ubuntu de Jaunty à Karmic. Cela inclut apparemment une mise à jour du compilateur GNU C, car le code compilé précédemment ne le fait plus.Comment utiliser le drapeau -MG dans cc 4.4.1?

cc 4.4.1 Exécution (Ubuntu 4.4.1-4ubuntu8) produit maintenant l'erreur suivante, le code qui a bien fonctionné dans le cc 4.3.3 (Ubuntu 4.3.3-5ubuntu4):

$ make 
cc -c -MMD -MG -MP -MF lex.d -g -Wall -O -o lex.o lex.c 
cc1: error: -MG may only be used with -M or -MM 

Ajout soit le drapeau -M ou -MM a entraîné le message suivant:

[...] 
flex -o lex.c lex.l 
cc -c -MM -MG -MP -MF lex.d -g -Wall -O -o lex.o lex.c 
[...] 
cc -g -Wall -O -o translate lex.o grammar.tab.o main.o list.o salloc.o suffixed.o expr.o emit.o optimize.o -lfl 
lex.o: file not recognized: File truncated 
collect2: ld returned 1 exit status 
make: *** [translate] Error 1 

On m'a dit que les différents -Mx disent drapeaux make comment les différents fichiers c dépendent .h fichiers. Ma meilleure solution à ce jour est de dire explicitement que tous les fichiers .c dépendent de tous les fichiers .h, pour s'assurer que tout reste à jour. Cependant, cela induit beaucoup de travail inutile à la compilation.

Ma question est donc: Comment ai-je besoin d'ajuster les drapeaux pour cc pour qu'il gère à nouveau automatiquement les dépendances?

+0

Bienvenue chez Super User! Cette question semble liée au développement de logiciels, et sera donc probablement déplacée vers Stack Overflow. Juste pour être sûr: s'il vous plaît ne postez pas la même question sur Stack Overflow vous-même, il sera déplacé automatiquement si nécessaire. Si elle a été déplacée, connectez-vous à http://stackoverflow.com en utilisant le même OpenID et associez vos comptes sur http://superuser.com/users/18508?tab=accounts. En attendant, n'oubliez pas de lire la FAQ! Succès. (Et peut-être que je me trompe et vous verrez de bonnes réponses ici à Super User après tout!) – Arjan

+0

Je l'ai mis ici parce que c'était lié à la mise à niveau de Jaunty à Karmic, mais à la réflexion, vous avez raison. C'est probablement un meilleur ajustement à Stack Overflow :) – Evanesco

Répondre

0

Le commutateur -MMD semble être le problème. Essayez de changer cela en -MM, ce qui devrait permettre au commutateur -MG de fonctionner. Selon la documentation de GCC au http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Preprocessor-Options.html, -MMD est identique à -MM avec une option -MF implicite, et puisque vous avez déjà un fichier de sortie spécifié avec -MF, vous devriez pouvoir utiliser le formulaire plus simple.

+0

Merci pour votre suggestion.Malheureusement, en remplaçant l'indicateur -MMD par -MM renvoie l'erreur "fichier non reconnu: fichier tronqué" :(.J'ai mis à jour la question avec le contexte de l'erreur, peut-être que cette information peut aider? – Evanesco

+0

Le problème est que -MM est utilisé dans une compilation de premier passage pour générer des dépendances ... en général, vous lancez à nouveau gcc pour créer le fichier objet, mais utiliser -MM avec -o est problématique, car vous écrivez ces informations de dépendance dans le fichier. pense que c'est mis à jour, mais ce que vous avez dans le .o n'est pas valide. –

2

Le but du commutateur -MG est de permettre au générateur d'auto-dépendance de fonctionner correctement même si les fichiers d'en-tête réels doivent encore être créés. Cependant, lorsque vous essayez réellement de compiler le code, il est important que les en-têtes existent; afin qu'ils puissent être compilés. Pour cette raison, -MG ne peut être utilisé qu'avec -MM ou -M, ce qui implique l'indicateur -E, ce qui signifie qu'ils ne compilent pas le code. Donc, si vous voulez utiliser -MG, vous devrez utiliser des commandes séparées pour générer des dépendances et compiler. Par exemple

cc -MM -MG -MP -MF lex.d lex.c 
cc -c -g -Wall -O -o lex.o lex.c 

Ou, écrivez le fichier make de telle sorte que les en-têtes soient générés en premier. par exemple

GENERATED=(list of headers that get created during the build process) 

lex.o: lex.c | $(GENERATED) 
    cc -c -MMD -MP -MF lex.d -g -Wall -O -o lex.o lex.c 
##... 
## individual build rules for generated headers. 

Notez que le '|' signifie que lex.o doit être généré après les fichiers générés, mais il ne dépend pas nécessairement des fichiers générés. c'est à dire. il sera construit après les en-têtes, mais il ne sera pas reconstruit si les en-têtes changent à moins d'être explicitement spécifiés.