Какие файлы на самом деле включены при компиляции - PullRequest
7 голосов
/ 10 октября 2010

У меня очень большой код, многие из которых являются устаревшими.Я хочу знать, какие из этих файлов участвуют в компиляции.Код написан на компиляторах GNU и в основном на C / C ++, но некоторые также и в других программах.Любой совет будет высоко оценен.

Спасибо,

Моше.

Я компилирую под Linux с набором скриптов / make-файлов.Я хочу как-то «обернуть» эту сборку инструментом, который выдаст выходные данные всех исходных файлов, используемых в сборке, предпочтительно с абсолютными именами путей.

Ответы [ 5 ]

10 голосов
/ 10 октября 2010

Если вы хотите показать включенные заголовки, то, поддерживается ли это и как это сделать, зависит от компилятора.

Например,

C:\test> (g++ --help --verbose 2>&1) | find "header"
  -print-sysroot-headers-suffix Display the sysroot suffix used to find headers
  --sysroot=<directory>    Use <directory> 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<file> name forced include file      /U<name> remove predefined macro
/u remove all predefined macros         /I<dir> add to include search path
/nologo suppress copyright message      /showIncludes show include file names

C:\test> _

В приведенном выше вы можете увидеть соответствующие параметрысоответственно для g ++ и Visual C ++.

Приветствия & hth.,

- Alf

2 голосов
/ 10 октября 2010

Для данного модуля компиляции, например, foo.cpp, добавьте флаги -E -g3 к вызову g ++.Это дает вам предварительно обработанный код.Там вы можете посмотреть, какие вещи включены.

1 голос
/ 10 октября 2010

На ум приходят два варианта.

  1. Анализ журнала компиляции

    Запуск сборки, сохранение журнала и поиск в журнале.

  2. Найдите файлы, которые открываются во время компиляции.

    Для этого можно использовать инструмент системной трассировки, такой как strace или инструмент трассировки библиотекикак ltrace , а затем высматривать вызовы открытия файла.

    См. Также Как определить доступ к файлам в Linux?

0 голосов
/ 14 июля 2018

Вот методика, которая находит все включаемые файлы, используя make. Это не навязчиво, поэтому вам не нужно вносить какие-либо изменения в файлы или даже на самом деле компилировать. Make сделает всю работу за вас.

make -d

запустит make и выдаст множество строк, описывающих внутреннюю обработку процесса make. Наиболее важным является учет зависимостей.

Анализируя выходные данные, легко найти зависимости и все другие файлы.

Вот командная строка Linux, которая получает отсортированный список каталогов, содержащих файлы включения:

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

В этом случае каталоги заключаются в кавычки и в конце добавляется запятая, поэтому выходной сигнал готов для включения в файл конфигурации кода Visual Studio (vscode) c_cpp_properties.json

Простые варианты могут создавать большой список включаемых зависимостей, например так:

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

Это также должно работать с целями (например, make All)

0 голосов
/ 10 октября 2010
  1. Как вы строите приложение?Т.е. что вы набираете в терминале для его сборки?
  2. В зависимости от вашего ответа на (1) найдите соответствующую программу, используемую для сборки (то есть make, scons и т. Д.)
  3. Теперь найдите входные файлы для этой программы сборки, например Makefile, SConstruct и т. Д.
  4. Просмотрите этот файл сборки и другие файлы сборки, используемые им, чтобы выяснить, какиеисходные файлы идут в сборку
...