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.
Analyser le journal de compilation
Exécutez une construction, enregistrez le journal, puis effectuez une recherche dans le journal.
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.
scons
, scons
, etc.) Makefile
, SConstruct
, etc. 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
)