Parfois, lorsque je change de code dans mon projet QT (Qt Creator 2.1.0 avec Mingw32), les modifications ne se reflètent pas dans le code de la machine produite après la construction. Cela se produit principalement lorsque je change de choses comme des valeurs par défaut dans les constructeurs ou l'ordre des paramètres dans les méthodes / constructeurs. Habituellement, une reconstruction complète corrige cela (mais prend quelques minutes). P>
Je m'essoute de moi en supprimant les exécutables ou les bibliothèques générés avant de construire, ce qui semble aider la plupart du temps. Cela signifie-t-il que quelque chose ne va pas mal lors de la liaison des fichiers d'objets? P>
Je viens de Java / .Net et je suis habitué à un comportement différent. Je serais heureux que quelqu'un puisse me expliquer ce que je fais mal et / ou me diriger vers des articles connexes. P>
Merci! P>
4 Réponses :
L'affaire la plus courante pour cela sont des dépendances cassées. Dans le cas particulier des arguments par défaut sur les fonctions, ils sont résolus au lieu de l'appel. Si vous ne recompilez que la fonction, le code sera exactement le même. Vous devez recompiler l'appelant em>. Si les dépendances du projet ne sont pas correctes et que le système de construction ne détecte pas qu'il doit recompiler l'appelant et ne recompille que la callee, alors vous verrez cet effet. Analyser les dépendances et les réparer. P> Exemple: p>
Comment vous suggérer de spécifier une dépendance connue dans le fichier de projet QMake .Pro?
Si vous répertoriez tous les fichiers d'en-tête pertinents dans un fichier de projet, cela ne devrait pas arriver. Mais en fait, cela arrive tout le temps car qmake est buggy (il a connu des problèmes de génération de dépendances non déterminés depuis des années). Tellement mieux nettoyer-le et recompiler ou utiliser cmake. Et aussi, QMake ne sait rien (et ne détecte presque rien) sur les dépendances entre les fichiers source et les fichiers d'en-tête, ce qui peut entraîner des problèmes comme celui-là. P>
Le renvoi et la suppression de fichiers sont le moyen le plus simple de bousiller QMake. Très mauvais que personne dans l'équipe QT ne reçoit la priorité pour la correction de ces bugs.
Si votre Voici un petit morceau d'un Makefile code> (ou votre équivalent moral à un Makefile code>) manque des informations de dépendance, vous pouvez obtenir des constructions hors synchronisation. Pour chaque fichier avec #include "header.h" code>, vous devez vous assurer que le fichier Makefile code> met header.h code> comme une dépendance sur ce fichier . Makefile Code> J'ai: P> parser_yacc.c parser_yacc.h: parser_yacc.y parser.h
$(YACC) $(YFLAGS) -o parser_yacc.c parser_yacc.y
parser_lex.c: parser_lex.l parser_yacc.h parser.h
$(LEX) ${LEXFLAGS} -o$@ $<
parser_lex.o: parser_lex.c parser.h parser_yacc.h
$(CC) $(EXTRA_CFLAGS) -c -o $@ $<
parser_misc.o: parser_misc.c parser.h parser_yacc.h af_names.h cap_names.h
$(CC) $(EXTRA_CFLAGS) -c -o $@ $<
Makefile est autogène par QMake Utility.
généralement, après une modification d'un en-tête, tous les fichiers source, y compris cet en-tête, devraient être reconstruits.
Toutefois, QMAKE est un peu particulière à cet égard, vous devez définir la dépendance pour inclure des dossiers autres que le répertoire actuel. Par exemple, si vous avez ajoutez aussi p> uniquement avec dépendance, les fichiers construits par les fichiers .pro sont reconstruits si quelques-unout Certains_path_in_my_project change (s'ils incluent cet en-tête)! p> Je suggère d'ajouter pour chaque ligne IncludePath une ligne de dépendance identique, sauf si vous n'incluez pas un répertoire système, vous ne vous attendez pas à changer. P> EDIT: strong> p> Un problème similaire existe lors de la liaison statiquement avec QMake: Si les modifications des fichiers STATIC LIB FOO.A. C'est un bug de QMake, sans générer les bonnes dépendances. P> Une solution de contournement que j'ai trouvée dans un ancien projet: p> Depuis quelque temps (Qt 5?), le code ci-dessus doit utiliser Post_Targetdeps au lieu de TargetDeps. P> P>
Cela signifie de recompiler tous les fichiers source si l'un des fichiers incluent-il en dépendance est modifié? Il semble assez proche de la reconvertie complète.
Serge Dundich: Non, le fichier .CPP n'est recompilé que s'il inclut un en-tête qui a changé. Cela fonctionne au niveau par fichier.
La dépendance était le mot clé que je cherchais, merci beaucoup!
Construisez-vous statiquement? J'ai eu un problème comme celui-ci avec des constructions statiques.
Oui, nous faisons des constructions statiques. Je vais enquêter plus loin et conserver cette question à jour si je trouve des informations nouvelles. Vous ne connaissez aucune matière liée à ce type de problèmes avec des bâtiments statiques et QT?
Atamanroman: J'ai ajouté la solution de contournement d'un ancien projet. IIRC qui le corrigé.
Les fichiers d'objet restent-ils aussi inchangés?