【问题标题】:Get list of file compiled and included by make project获取 make 项目编译和包含的文件列表
【发布时间】:2015-07-17 15:27:02
【问题描述】:

我有一个相当大的 make 文件项目 (c++),它根据环境变量构建某些文件并忽略我的源目录中的其他文件。

我想用当前的环境设置生成一个在 make 过程中实际使用的文件列表。 IE。我想编译所有源文件并打印所有包含的头文件。

我想这样做的原因是能够将所有文件添加到 qtcreator 项目中,因此只能在我的项目中获取相关文件。

我知道我以前做过这个,但现在我似乎在互联网上的任何地方都找不到它。

编辑:我很确定这应该可以在不编辑 makefile 的情况下进行,并且由于 make 系统的复杂性,在这种情况下会更可取。该项目涉及很多makefile。

【问题讨论】:

  • 在linux下你可以使用strace拦截所有被访问的文件,windows下是procmon.exe。

标签: c++ makefile


【解决方案1】:

Make 本身没有办法做到这一点。

通常,添加一个名为“list_files”的目标或类似的东西:

 .phony: list_files
 list_files:
        echo $SOURCES

当然,调整以适应包含您的来源列表的变量。

要列出特定文件中包含的文件,您需要使用:

 .phony: list_includes
 list_includes:
      ${CXX} -MM $SOURCES

(这不会列出系统文件中的标头 - 使用单个 M 选项 -M 给出包含的每个文件的完整列表,但这通常没有用,并且会产生很长的列表)

【讨论】:

    【解决方案2】:

    “make”本身会打印它执行的所有命令。只需使用“cpp”和“h”过滤器对它们进行 grep:

    make |grep -o -e "\w*\.cpp" -e "\w*\.h"
    

    -o 参数只打印匹配的部分,而不是整行。需要打印匹配的源文件名。

    【讨论】:

    • 不幸的是,在我的例子中,make 打印的命令并没有真正包含任何文件名。
    • 探索是否可以在您的案例中显示已执行的命令。例如,在原生 Android 编译中,“make”不会打印整个命令,而只会打印编译后的文件名。使用make showcommands 打印整个命令。
    • 在autotools生成的makefile中,可以使用verbose参数:make V=1。这是关于在 make 中显示命令的问题:stackoverflow.com/questions/5820303/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-19
    • 2016-07-07
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    相关资源
    最近更新 更多