【问题标题】:Mixing cl, clang-cl and clang in the same project在同一个项目中混合 cl、clang-cl 和 clang
【发布时间】:2022-06-11 00:49:30
【问题描述】:

上下文

我正在开发一个依赖于高性能敏感开源库的跨平台项目。该库支持许多不同的编译器,但性能最高的版本是通过 clang 编译的,因为 MSVC 编译器 (cl) 不支持内联汇编。这向我强调了 clang 能够在 Windows 上编译代码,并发出高性能的 dll 库,但我对 MSVC 工具链和 clang 生态系统的互操作性的理解也存在缺陷。

问题

clang 编译的代码在多大程度上可以与 MSVC 工具链互操作?

  • clang ABI 发出的二进制文件是否与 cl 发出的二进制文件兼容,直至并包括最新的语言标准?
  • 具体来说,使用 clang 编译的静态库 (.a) 是否可以被 MSVC 工具链使用? (即符号定义不是 dllexport/imported)。
  • clang 能否发出 32 位二进制文​​件?
  • 我知道 clang-cl 只是 clang 的一个驱动程序,但是对于新项目是否有任何实际限制或其他原因不支持 clang-cl 而不是 cl?

【问题讨论】:

  • 我在最初的问题中没有注意到它,但我已经评估了该链接的内容。它提供了有价值的技术信息并以有意义的方式为答案做出了贡献,因此感谢您做出贡献。

标签: c++ visual-c++ clang clang-cl


【解决方案1】:

具体来说,用 clang 编译的静态库 (.a) 可以被 MSVC 工具链使用吗? (即符号定义不是 dll 导出/导入)。

是的。我有一个相当大的 Windows(基于 MFC)项目,在该项目中,我使用本地 MSVC 编译器来构建所有实际使用任何 MFC(或其他 WinAPI)代码的组件,但使用 clang-cl特定的“核心”模块(构建为静态库)。该核心模块中的所有代码都严格符合标准(目前是 C++17,但见下文)。我使用这种 MSVC+clang 组合已经有几年了,还没有遇到任何与 ABI 不兼容相关的问题。 (但请注意,Windows 上的静态库具有“.lib”扩展名,而不是“.a”。)

clang ABI 发出的二进制文件是否与 cl 发出的二进制文件兼容,直至并包括最新的语言标准?

是的——但是对于 C++20 或更高版本,您需要 VS 2022:VS 2019 附带的 clang-cl 编译器 (V11) 只能识别(包括)C++17;但是,clang-cl V13(由 VS 2022 安装)可以设置为使用 C++20 或 C++23。 (另请注意,我上面提到的库大量使用“STL”容器,例如std::vector。)

clang 可以发出 32 位二进制文​​件吗?

是的。在 VS IDE 中切换 64 位和 32 位目标架构同样适用于 MSVC 和 clang-cl 项目。这也似乎在切换到 ARM64 目标时起作用(假设您已经安装了所需的工具),但我无法验证最终输出,因为我无法访问基于 ARM64 的 Windows系统。

我承认 clang-cl 只是一个 clang 的驱动程序,但是是否有任何实际限制或其他理由不支持 clang-cl 而不是 cl 新项目?

我曾尝试使用 clang-cl 工具构建我的整个项目,但是 - 到目前为止 - 没有成功。这可能是由于我正在使用 MFC(我在链接时得到一大堆重复和/或丢失的符号)。但是,使用 clang-cl 为 Windows 构建简单的控制台模式程序就可以了。

还有一点需要注意:与使用 MSVC 编译的相同代码相比,使用 clang-cl 编译该核心库时,我的最终程序的运行时性能相当更高(即更快) .

【讨论】:

  • 这正是我一直在寻找的洞察力和精确度。我将把这个问题留待一段时间,以便进行任何进一步的 cmets / 讨论,但我非常感谢您的洞察力。除了您的回答之外,您能否评论运行时清理程序的状态和 OpenMP 支持?最后,有什么理由支持 MSVC 工具包附带的 clang-cl,而不是(更新的?) Windows 发行版的 clang?
  • @blockchaindev 关于 OpenMP 问题:不知道,不要使用它。在 clang-cl 与 clang ('native') 中:总是 使用 clang-cl,因为这(理论上)为您提供了 ABI 兼容性。我认为。关于为什么我不使用 OpenMP:嗯,从 C++17 开始,我们有 native 并行处理。
  • 对于 run-time 消毒剂不能说太多,但是,FWIW,我有一个使用 clang-cl compile 的配置(对于我的整个项目) -time(静态)代码分析器:它可以捕捉到很多本机 MSVC 分析器没有捕捉到的问题;为此,我感谢 clang 开发人员。
【解决方案2】:

我在 MS Windows 10 下从我的 c++ 文件构建了一个带有 clang 13 的 dll 和带有 msvc2015 的相同 dll,并使用依赖项walker 检查了结果。我看到了一个不同的 c++ 解构(_Z vs. ?@),所以我不敢相信 clang 和 msvc 之间有任何 ABI 兼容性。也许我忘记了一些关于 clang 的选项,但在我的情况下,去杂化的差异就像火和水一样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多