2009-08-21 5 views
0

Je lis un Makefile de quelqu'un d'autre comme suit.L'optimisation et la génération d'informations de débogage font partie de la compilation ou de la liaison

LDFLAGS=-lm -ljpeg -lpng 

ifeq ($(DEBUG),yes) 
     OPTIMIZE_FLAG = -ggdb3 -DDEBUG -fno-omit-frame-pointer 
else 
     OPTIMIZE_FLAG = -ggdb3 -O3 
endif 

CXXFLAGS = -Wall $(OPTIMIZE_FLAG) 

all: test 

test: test.o source1.o source2.o 
     $(CXX) $(CXXFLAGS) -o [email protected] $^ $(LDFLAGS) 

Makefile.depend: *.h *.cc Makefile 
     $(CC) -M *.cc > Makefile.depend 

clean: 
     \rm -f test *.o Makefile.depend 

-include Makefile.depend 

Voici mes questions:

  1. Bien que non explicitement, est $ (CXXFLAGS) utilisé par la règle implicite non représentée sur cette Makefile lors de la compilation pour générer des fichiers d'objet?

  2. Je me demande également pourquoi $ (CXXFLAGS) apparaît dans l'étape de liaison? Je pense que c'est seulement pour la phase de compilation? Puis-je supprimer $ (CXXFLAGS) de "$ (CXX) $ (CXXFLAGS) -o $ @ $^$ (LDFLAGS)"? Si je me trompe, cela signifie-t-il que g ++ génère aussi des informations de débogage et fait de l'optimisation au niveau de la liaison? Pourquoi utiliser ensemble -ggdb3 -O3 à des fins de non-débogage?

  3. Pourquoi? Quel devrait être son but? Si seulement envisageant d'améliorer la vitesse, alors n'utilise -O3 que mieux? Pour des raisons de débogage, comment utiliser ensemble -ggdb3 -fno-omit-frame-pointer fera mieux que -ggdb3 seul? J'essaie de comprendre le but de -fno-omit-frame-pointer en lisant le document gcc mais toujours confus. Puis-je déplacer "-include Makefile.depend" pour être juste sous "$ (CC) -M * .cc> Makefile.depend" et au-dessus "nettoyer"? Est-ce que sa position dans Makefile est importante?

Répondre

2

CXXFLAGS est utilisé par la règle implicite. Faites make -n -p pour voir la liste complète des variables et des règles que Make génère à partir de ses jeux de règles internes et du fichier make. -g Les options de débogage sont uniquement utilisées au stade de la compilation. Les options -O sont utilisées aux étapes de compilation et de liaison, potentiellement. Vous pouvez utiliser les deux ensemble. De ma page de manuel gcc:

GCC vous permet d'utiliser -g avec -O. Les raccourcis pris par le code optimisé peuvent parfois produire des résultats surprenants : certaines variables que vous avez déclarées peuvent ne pas exister du tout; flux de contrôle peut déplacer brièvement où vous ne l'avez pas attendre; certaines instructions ne peuvent pas être exécutées car elles calculent des résultats constants ou leurs valeurs étaient déjà à portée de main; Certains états peuvent s'exécuter à différents endroits car ils ont été déplacés hors des boucles.

Néanmoins, il est possible de déboguer une sortie optimisée. Cela permet d'utiliser l'optimiseur pour les programmes susceptibles de présenter des bogues.

-fno-omit-frame-pointer réduit réellement l'optimisation. L'optimisation peut interférer avec le débogage et la personne qui a écrit ce makefile a clairement l'intention d'exécuter le débogueur sur du code optimisé. Si le manuel de gcc ne vous explique pas comment cela fonctionne, vous pouvez vous asseoir un peu samedi avec le manuel de référence de l'architecture Intel ou AMD et en apprendre davantage sur les appels de fonctions et les arguments passant au niveau des instructions. (Ensuite, peut-être pas. :))

La position est importante dans Makefiles. Je laisserais ce fichier inclure à la fin.Faire autrement risque de casser la vérification de dépendance de fichier d'inclusion.

+0

Merci beaucoup! Voulez-vous dire que c'est "-ggdb3 -O3" qui est destiné à exécuter le débogueur sur du code optimisé? À des fins de non-débogage, "-ggdb3 -DDEBUG -fno-omit-frame-pointer" n'implique pas d'optimisation, alors pourquoi "-fno-omit-frame-pointer réduit réellement l'optimisation" s'il n'y a pas de code optimisé ? – Tim

+0

Je ne peux pas dire avec certitude. Il n'y a aucune garantie que ce makefile soit totalement cohérent. Peut-être cet ensemble de drapeaux est-il resté d'un autre changement ou la personne qui l'a écrit n'a pas entièrement compris leur signification. –

Questions connexes