Quels fichiers sont réellement inclus lors de la compilation

J’ai un code très volumineux, dont beaucoup est hérité. Je veux savoir lequel de tous ces fichiers participe à la compilation. Le code est écrit dans les compilateurs GNU et principalement en C / C ++, mais aussi dans d’autres programmes. Tout conseil sera très apprécié.

Merci,

Moshe.

Je comstack sous Linux avec un mélange de scripts et de makefiles. Je veux en quelque sorte “encapsuler” cette construction avec un outil qui donnera une sortie de tous les fichiers source utilisés dans la construction, de préférence avec des noms de chemins absolus.

Que dis-tu?

Deux options me viennent à l’esprit.

  1. Analyser le journal de compilation

    Exécutez une construction, enregistrez le journal, puis effectuez une recherche dans le journal.

  2. Recherchez les fichiers ouverts lors de la compilation.

    Pour ce faire, utilisez un outil de traçage système tel que strace ou un outil de traçage de bibliothèque tel que ltrace , puis recherchez les appels de fichiers ouverts.

    Voir aussi Comment puis-je détecter les access aux fichiers sous Linux?

Si vous souhaitez afficher les en-têtes inclus, vous devez savoir si cela est pris en charge et comment le faire dépend du compilateur.

Par exemple,

C:\test> (g++ --help --verbose 2>&1) | find "header" -print-sysroot-headers-suffix Display the sysroot suffix used to find headers --sysroot= Use  as the root directory for headers -H Print the name of header files as they are used -MG Treat missing header files as generated files -MM Like -M but ignore system header files -MMD Like -MD but ignore system header files -MP Generate phony targets for all headers -Wsystem-headers Do not suppress warnings from system headers -print-objc-runtime-info Generate C header of platform-specific features -ftree-ch Enable loop header copying on trees C:\test> (cl /? 2>&1) | find "include" /FI name forced include file /U remove predefined macro /u remove all predefined macros /I add to include search path /nologo suppress copyright message /showIncludes show include file names C:\test> _ 

Dans ce qui précède, vous pouvez voir les options pertinentes pour respectivement g ++ et Visual C ++.

Vive & hth.,

– Alf

Pour une unité de compilation donnée, par exemple foo.cpp, ajoutez les indicateurs -E -g3 à l’appel de g ++. Cela vous donne le code prétraité. Là vous pouvez regarder ce qui est inclus.

  1. Comment construisez-vous l’application? C’est-à-dire que vous tapez au terminal pour le construire?
  2. En fonction de votre réponse à (1), trouvez le programme approprié utilisé pour la construction (c.-à-d. scons , scons , etc.)
  3. Recherchez maintenant le ou les fichiers d’entrée de ce programme de construction, tels que Makefile , SConstruct , etc.
  4. Examinez ce fichier de construction et les autres fichiers de construction utilisés par celui-ci pour déterminer quels fichiers source vont dans la construction.

Voici une technique qui trouve tous les fichiers d’inclusion à l’aide de make . C’est non intrusif, vous n’avez donc pas besoin de modifier les fichiers, ni même de les comstackr. Make fera tout le travail pour vous.

 make -d 

va lancer et émettre beaucoup de lignes décrivant le traitement interne du processus de création. Le plus important est la prise en compte des dépendances.

En analysant la sortie, il est facile de trouver les dépendances et tous les autres fichiers.

Voici une ligne de commande Linux qui obtient une liste sortingée de répertoires contenant des fichiers d’inclusion:

 make -d | awk '/Prerequirejsite/ { if(match($2,".(.*)(/)(.*\\.h)",m)) { c[m[1]]++ ; } } END {for(d in c) print "\"" d "\",";} ' | sort 

Dans ce cas, les répertoires sont cités et une virgule est ajoutée à la fin, de sorte que la sortie est prête à être incluse dans le fichier de configuration Visual Studio Code (vscode) c_cpp_properties.json

Des variantes simples peuvent produire la grande liste de dépendances include, comme ceci:

 make -d | awk '/Prerequirejsite/ { if(match($2,".(.*\\.h)",m)) { c[m[1]]++ ; } } END {for(d in c) print d ;} ' | sort 

Cela devrait également fonctionner avec des cibles (par exemple, make All )