clang 如何在 Windows 上工作?
How clang works on Windows?
我想知道 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"
}
]
}
Clang 只是一个编译器,而且是一个灵活的编译器。 Clang 参与的 LLVM 伞形项目还提供了一个链接器 (lld) 和一个 C++ 标准库 (libc++) 以及其他低级的东西。
在 Windows 上,您有两个主要选择:
使用 clang-cl
:使用理解 cl.exe
的 optionsns 的 clang 包装器进行编译。这链接到 Visual C++ runtime/library,因此您实际上只替换了 Visual Studio 编译器,而不是 library/runtime。您这样编译的代码应该与普通的 MSVC 编译代码兼容。
使用clang
:这是理解类似GCC选项的clang驱动程序。如果你想针对 MinGW-w64 运行时进行编译,你将使用它。
Clang 可以选择 select 它的 C++ 标准库:-stdlib=libc++
select LLVM libc++。我怀疑这是否适用于 clang-cl
,但老实说我还没有尝试过。
如果通过 MSYS2 安装 Clang+libc++,则可以使用 -stdlib
选项针对 libc++ 和 MinGW-w64 运行时进行编译。
至于您的具体问题:您似乎在为 Clang 使用 GNU 风格的界面,但它检测到您在 Windows 上并像使用 clang-cl 一样进行编译。
我认为你最好的选择是尝试 MinGW-w64-targeting clang(例如我上面建议的来自 MSYS2)。
由于 Clang 是一个灵活的编译器,您还可以使用 -target
命令行选项指定目标。不幸的是,我不知道您需要的值(也不知道实际找到 libc++ headers/libraries 的额外选项)。
话虽如此,我不确定 libc++ 是否适用于 Visual Studio 目标 Clang。
去年的一些笔记,关于在 Windows 上使用 CMake 下的 Clang 构建重要代码库的失败尝试(它建立在 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
我想知道 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"
}
]
}
Clang 只是一个编译器,而且是一个灵活的编译器。 Clang 参与的 LLVM 伞形项目还提供了一个链接器 (lld) 和一个 C++ 标准库 (libc++) 以及其他低级的东西。
在 Windows 上,您有两个主要选择:
使用
clang-cl
:使用理解cl.exe
的 optionsns 的 clang 包装器进行编译。这链接到 Visual C++ runtime/library,因此您实际上只替换了 Visual Studio 编译器,而不是 library/runtime。您这样编译的代码应该与普通的 MSVC 编译代码兼容。使用
clang
:这是理解类似GCC选项的clang驱动程序。如果你想针对 MinGW-w64 运行时进行编译,你将使用它。
Clang 可以选择 select 它的 C++ 标准库:-stdlib=libc++
select LLVM libc++。我怀疑这是否适用于 clang-cl
,但老实说我还没有尝试过。
如果通过 MSYS2 安装 Clang+libc++,则可以使用 -stdlib
选项针对 libc++ 和 MinGW-w64 运行时进行编译。
至于您的具体问题:您似乎在为 Clang 使用 GNU 风格的界面,但它检测到您在 Windows 上并像使用 clang-cl 一样进行编译。 我认为你最好的选择是尝试 MinGW-w64-targeting clang(例如我上面建议的来自 MSYS2)。
由于 Clang 是一个灵活的编译器,您还可以使用 -target
命令行选项指定目标。不幸的是,我不知道您需要的值(也不知道实际找到 libc++ headers/libraries 的额外选项)。
话虽如此,我不确定 libc++ 是否适用于 Visual Studio 目标 Clang。
去年的一些笔记,关于在 Windows 上使用 CMake 下的 Clang 构建重要代码库的失败尝试(它建立在 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