【问题标题】:How clang works on Windows?clang 如何在 Windows 上工作?
【发布时间】:2020-02-20 11:56:12
【问题描述】:


我想知道 clang 如何在 Windows 系统上工作。

我按照this website 上的教程学习并成功构建了二进制文件。

这是我的问题。

当我以调试模式构建项目时,它会生成 .exe、.pdb、.ilk。
调试也可以正常工作,但是当我介入某些功能(例如:std::vector::push_back)时,它会在 VisualStudio 上找到矢量源文件。

我认为,它应该没有找到源文件,因为 push_back 的实现应该属于 libclang。

为什么会这样?

测试代码如下

    auto answer = [](int n)
    {
        return 32 + n;
    };

    constexpr int response = answer(10);

构建命令是

C:/Program Files/LLVM/bin/clang++.exe' -std=c++2a ./example_1.cpp -o example_1.exe --debug

仅供参考我的系统有 VisualStudio 2015 和 LLVM 9.0。 vs代码配置是

    /* c_cpp_properties.json */
{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${workspaceFolder}/**",
                "C:/Program Files/LLVM/include/llvm-c",
                "C:/Program Files/LLVM/include/clang-c"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "windowsSdkVersion": "8.1",
            "compilerPath": "\"C:/Program Files/LLVM/bin/clang++.exe\"",
            "cStandard": "c11",
            "cppStandard": "c++20",
            "intelliSenseMode": "clang-x64"
        }
    ],
    "version": 4
}


    /* launch.json */
{
    "version": "0.2.0",
    "configurations": [
      {
        "name": "(Windows) Launch",
        "type": "cppvsdbg",
        "request": "launch",
        "program": "${workspaceFolder}/example_1.exe",  
        "args": [],
        "stopAtEntry": false,
        "cwd": "${workspaceFolder}",
        "environment": [],
        "externalConsole": true
      }
    ]
  }
}

    /* tasks.json */
{
    // See https://go.microsoft.com/fwlink/?LinkId=733558 
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "type": "shell",
            "label": "clang++.exe build active file",
            "command": "C:/Program Files/LLVM/bin/clang++.exe",
            "args": [
                "-std=c++2a",
                "./example_1.cpp",
                "-o",
                "example_1.exe",
                "--debug"
            ],
            "group": "build"
        }
    ]
}

【问题讨论】:

    标签: windows clang llvm


    【解决方案1】:

    去年关于在 CMake 下使用 Clang 在 Windows 上构建重要代码库的尝试失败的一些笔记(它基于 MacOS 和两种 Linux 版本构建):

    • 要让CMake在Windows上生成,多维大海捞针中针的坐标为:x64 Native Command Prompt, NMake Makefiles, clang-cl.exe, CMAKE_CACHE_ARGS -D CMAKE_CXX_FLAGS:STRING=${CMAKE_CXX_FLAGS}。 (关于 CMake 的 Packt 书曾经很不错,但没有解释大部分内容。)
    • @rubenvb 对 Windows 上的 -stdlib 选项持怀疑态度是正确的;甚至--help 也是错误的:“但实际上使用“-stdlib=”会发出有关未使用参数的警告,”bugs.llvm.org/show_bug.cgi?id=39878

    【讨论】:

      【解决方案2】:

      Clang 只是一个编译器,而且是一个灵活的编译器。 Clang 参与的 LLVM 伞形项目还提供了链接器 (lld) 和 C++ 标准库 (libc++) 以及其他低级功能。

      在 Windows 上,您有两个主要选择:

      1. 使用clang-cl:使用可以理解cl.exe 的optionns 的clang 包装器进行编译。这链接到 Visual C++ 运行时/库,因此您实际上只替换了 Visual Studio 编译器,而不是库/运行时。你这样编译的代码应该和普通的 MSVC 编译的代码兼容。

      2. 使用clang:这是可以理解类似 GCC 选项的 clang 驱动程序。如果要针对 MinGW-w64 运行时进行编译,可以使用它。

      Clang 有一个选择其 C++ 标准库的选项:-stdlib=libc++ 选择 LLVM libc++。我怀疑这是否适用于clang-cl,但老实说我还没有尝试过。 如果您通过 MSYS2 安装 Clang+libc++,则可以使用 -stdlib 选项针对 libc++ 和 MinGW-w64 运行时进行编译。


      至于您的具体问题:您似乎正在为 Clang 使用 GNU 风格的界面,但它检测到您在 Windows 上并像使用 clang-cl 一样编译。 我认为你最好的选择是尝试一个 MinGW-w64-targeting clang(例如我上面建议的来自 MSYS2)。

      由于 Clang 是一个灵活的编译器,您还可以使用 -target 命令行选项指定目标。不幸的是,我不知道您需要的值(也不知道实际使它找到 libc++ 头文件/库的额外选项)。 话虽如此,我不确定 libc++ 是否适用于针对 Clang 的 Visual Studio。

      【讨论】:

      • 请原谅我的菜鸟,您提到了编译器、链接器和标准库。您能否澄清一下,即使您拥有所有这三个,仍然需要什么“mingw 运行时”?
      猜你喜欢
      • 1970-01-01
      • 2022-12-06
      • 2012-03-14
      • 1970-01-01
      • 2011-01-24
      • 2021-12-03
      • 1970-01-01
      • 2016-09-19
      • 2016-11-05
      相关资源
      最近更新 更多