【问题标题】:How to extract compilation args for each compilation unit in a vcxproj?如何为 vcxproj 中的每个编译单元提取编译参数?
【发布时间】:2013-10-30 02:39:41
【问题描述】:

我正在尝试获取每个编译单元的编译参数,这样我就可以为我的 vcxproj 创建“compilation_commands.json”,它可以与 clang 的 libTooling 一起使用。

libTooling tutorial 建议使用CompilationDatabase 为项目中的所有 cpp 文件提供编译参数。本教程显示 CMake 可以为基于 CMake 的项目生成 compiler_commands.json。

由于可以通过clang.exe --driver-mode=clclang-cl.exe 将clang 置于“MSVC 模式”,我的想法是如果我可以在我的VS2012 项目中获得每个cpp 文件的编译参数,我可以为vcxproj 创建compile_commands.json。

但是,我在 VS2012 SDK 中查找 API 时遇到了问题,这些 API 会遍历 vcxproj 并检索每个编译单元的编译参数。有人可以指出正确的 API 吗?

【问题讨论】:

  • 你不会在 Visual Studio SDK 中找到它,构建是 MSBuild.exe 的工作。您可以修改 .targets 文件,但您很快就会迷路。非常简单的方法是提供 cl.exe 和 link.exe 的替代品。捕获命令行并将其写入文件。

标签: visual-studio-2012 msbuild clang visual-studio-sdk


【解决方案1】:

我知道这真的很老了,但这个问题仍然很重要,所以对于那些仍在寻找答案的人,我最近终于使用this little VS 扩展来做到这一点。

只需安装它,就会出现一个新的“Sourcetrail”菜单,其中包含一个“创建编译数据库”条目(我发现需要启用 Intellisense 才能使其可点击)。这将使您可以自定义要包含的内容并生成一个compile_commands.json,您可以将其与其他基于 clang 的工具等一起使用。

【讨论】:

  • 我很高兴你发布了这个!帮了我很多!谢谢!
【解决方案2】:

这是一项 DIY 工作。 VS IDE 项目具有每个 .cpp 文件的属性。通过选择 .cpp,然后右键单击 -> 属性 -> 配置属性 -> C/C++ -> 命令行,您可以获得编译该特定文件所需的选项。 64 美元的问题是如何为项目/解决方案中的每个文件执行此操作。答案不是微不足道的,而是可行的。至少我在 VS 2010 上做到了,而且我很确定它可以在 VS 2012/3 上运行

秘密在于所谓的 VCEngine。它是一个评估项目中所有属性或文件的工具。所以真正的问题是如何评估每个文件的“命令行”属性。您需要遍历所有 .cpp 文件并为“命令行”属性调用 VCProject 的 Evaluate 方法。

我认为最简单的方法是为 VS IDE 编写一个插件,从而获得对 VCEngine 实例的访问权限。有很多例子可以说明如何做到这一点。请注意,VCEngine 取决于版本。

无论如何,对于具有数千个 .cpp 文件的项目/解决方案,您需要自动创建编译数据库。

有时间我会把解决方案放在github上

【讨论】:

    【解决方案3】:

    您可能有兴趣阅读本文 compile_commands.json for Windows/MSVC

    【讨论】:

      【解决方案4】:

      您可以尝试解析中间目录中的 CL.command.* 文件。

      https://gist.github.com/Trass3r/f3fbe6807d28106e917368c33abf45d4

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-10
        • 1970-01-01
        • 2015-04-05
        相关资源
        最近更新 更多