【问题标题】:How To Get g++ to list paths to all #included files如何让 g++ 列出所有#included 文件的路径
【发布时间】:2013-12-26 21:38:51
【问题描述】:

我想让 g++/gcc 告诉我在 C++ 构建中 #include-ing 的所有非系统的路径。事实证明,这是一个艰难的搜索,因为 Google 必须以十种不同的方式对其进行解释。

我想要这些文件名和路径,以便我可以将它们添加到 Exuberant CTAGS 的搜索路径中。我们有一个庞大的项目,如果我在整个项目上使用 ctags,生成标签文件大约需要半小时,而编辑器进行查找的时间几乎一样长。

我们使用 CMakeLisats 进行编译。如果有一个指令我可以粘贴到 CMakeLists.txt 中,那就更棒了。

我真的不需要默认路径和文件名,Johnathan Wakely 为 here 提供了一个很好的工具。我认为这几乎涵盖了这是一项交叉编译工作的事实。我也不需要跨系统文件。

【问题讨论】:

    标签: c++ c gcc g++ include-path


    【解决方案1】:

    您需要使用 -M 选项调用 g++。

    来自manual

    不是输出预处理的结果,而是输出一条规则 适合 make 描述主源文件的依赖关系。 预处理器输出一个包含目标文件名的 make 规则 对于该源文件,冒号和所有包含的名称 文件,包括来自 -include 或 -imacros 命令行的文件 选项。

    值得阅读手册以考虑其他 -M 子选项(-MM-MF 可能特别有用)。

    【讨论】:

    • -MM -MF 成功了。给任何可能使用此答案的人的注释,指定 -MM -MF 或 -H 阻止实际编译,使用它,然后将其注释掉。
    • -MM 将短路径连接在一行上。做出模棱两可的路径解释。你怎么能把它们列在新行上?
    【解决方案2】:

    尝试gccg++-H 选项(到它的preprocessor 部分)。来自doc

    -H

    打印使用的每个头文件的名称,以及其他正常活动。每个名称都缩进以显示它在“#include”堆栈中的深度。预编译的头文件也会被打印出来,即使被发现是无效的;一个无效的预编译头文件用“...x”打印,一个有效的用“...!”打印。

    它会告诉您包含的所有标题。您可以过滤掉(使用grep -vawk)那些您不想要的。

    您还可以考虑开发您的GCC plugin 以在某处注册这些标头(例如在您的sqlite 数据库中),这可能是受到this draft 报告或CHARIOTDECODER 欧洲项目的启发。您还可以考虑使用或扩展Clang static analyzer

    Oliver Matthews' answer 中建议的-M 选项相比,它不会告诉您更多信息(但会提供所有包含的文件)。

    【讨论】:

    • 比 -M 输出更漂亮,但是 -MM 摆脱了很多讨厌的系统文件。就我而言,有很多讨厌的文件。我仍然必须进入输出并删除 boost 和 Qt 标头(我使用了 X2 编辑器。grep、sed 或 awk 也可以这样做)。
    猜你喜欢
    • 2021-05-02
    • 1970-01-01
    • 2020-03-19
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多