编译时实际包含哪些文件

时间:2010-10-10 15:24:49

标签: c++ c gcc g++

我有一个非常大的代码,其中很多是遗留代码。 我想知道所有这些文件中哪一个参与编译。 代码是用GNU编译器编写的,主要用C / C ++编写,但也有一些在其他程序中编写。 任何建议将受到高度赞赏。

谢谢,

摩西。

我在linux下使用各种脚本/ makefile进行编译。我想以某种方式用一个工具“包装”这个构建,该工具将提供构建中使用的所有源文件的输出,最好是具有绝对路径名。

你说什么?

5 个答案:

答案 0 :(得分:10)

如果要显示包含的标题,那么是否支持它以及如何执行它取决于编译器。

如,

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 ++的相关选项。

干杯&amp;第h。,

- Alf

答案 1 :(得分:2)

对于给定的编译单元,例如foo.cpp,将标志-E -g3添加到g ++的调用中。 这为您提供了预处理代码。在那里,您可以查看包含哪些内容。

答案 2 :(得分:1)

有两种选择。

  1. 解析编译日志

    运行构建,保存日志,然后在日志中搜索。

  2. 查找在编译期间打开的文件。

    这样做的方法可能是使用strace之类的系统跟踪工具或ltrace之类的库跟踪工具,然后查看文件打开调用。

    另见How can I detect file accesses in Linux?

答案 3 :(得分:0)

  1. 如何构建应用程序?即你在终端上键入什么来构建它?
  2. 根据您对(1)的回答,找到用于构建的相关程序(例如makescons等)。
  3. 现在找到该构建程序的输入文件,例如MakefileSConstruct等。
  4. 查看此构建文件及其使用的其他构建文件,以确定哪些源文件进入构建

答案 4 :(得分:0)

这是一种使用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)一起使用