尝试使用OpenMP 3中的功能
#pragma omp parallel for collapse(2)
Run Code Online (Sandbox Code Playgroud)
在Visual Studio 2017中; 我越来越error c3005: 'collapse' unexpected token encountered on openmp 'parallel for' directive
Visual Studio 2017似乎只支持OpenMP2.在一个支持OpenMP4.5的请求中,来自VS团队的说法
我们目前没有计划.
另一个答案说
幸运的是,clang-cl已成为OpenMP 4支持的可行替代方案.在最坏的情况下,您仍然可以启用/ fallback选项.
如何在Visual Studio 2017中使用clang-cl以及什么是后备选项?
在尝试评估Windows上的Clang时,利用Windows通用C运行时(...\Windows Kits\10\Include\10.0.15063.0\ucrt),我立即面临意外的墙,形式是未公开和意外的依赖在微软的Visual Studio上.显然,即使是最简单的C程序也只有在包含任何标准C头时才能编译,因为它们似乎最终都试图#include vcruntime.h(它不是UCRT的一部分).
我的问题是:
我正在尝试使用 CMake 作为主要构建工具在 Windows 机器上构建一个简单的应用程序。一旦在项目上调用 CMake,配置阶段就会出现错误:
> cmake -H. -G Ninja -Bbuild -DCMAKE_C_COMPILER:PATH="C:\Program Files\LLVM\bin\clang-cl.exe" -DCMAKE_CXX_COMPILER:PATH="C:\Program Files\LLVM\bin\clang-cl.exe"
-- The C compiler identification is Clang 7.0.0
-- The CXX compiler identification is Clang 7.0.0
-- Check for working C compiler: C:/Program Files/LLVM/bin/clang-cl.exe
-- Check for working C compiler: C:/Program Files/LLVM/bin/clang-cl.exe --broken
CMake Error at C:/Program Files/CMake/share/cmake-3.12/Modules/CMakeTestCCompile
r.cmake:52 (message):
The C compiler
"C:/Program Files/LLVM/bin/clang-cl.exe"
is not able to compile a simple test program.
It fails with the following output:
Change Dir: C:/Users/mak/Desktop/cmake-test/build/CMakeFiles/CMakeTmp
Run …
Run Code Online (Sandbox Code Playgroud) 我使用一个第三方项目,它会产生大量警告。我在 VS 项目属性中禁用了所有这些。有时,我会切换到LLVM clang-cl
工具集来检查 clang 发出的警告。第 3 方项目使用 clang-cl 产生如此多的警告,以至于 VS 的输出量令人窒息。我知道如何禁用它们,我通过命令行参数来做到这一点,例如:Wno-int-conversion -Wno-shift-op-parentheses
等。但是,问题是,当我切换回 VS 工具集时,所有这些禁用 clang-cl 警告的命令行参数都会变成错误(未知) cmd line args) 与 MS 编译器。
有没有办法在同一个 VS 项目中同时拥有 clang 和 VS 设置?也许,以某种方式以 ClangCL 工具集为条件,只能为 clang-cl 构建添加这些工具集?
我正在通过 clang-cl 在 Windows 上使用 Clang 5,并且-fno-rtti
在使用std::function
.
这是我无法编译的示例:
#include <functional>
void foo(std::function<void()> ra2)
{
}
int main()
{
auto bar = []()
{
};
foo(bar);
return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
命令行:
clang-cl test.cpp -Xclang -fno-rtti
Run Code Online (Sandbox Code Playgroud)
错误是:
C:\Program Files (x86)\Microsoft Visual Studio\Preview\Community\VC\Tools\MSVC\14.13.26128\include\functional(435,11): error:
cannot use typeid with -fno-rtti
return (typeid(_Callable));
^
Run Code Online (Sandbox Code Playgroud)
这让我感到惊讶,有没有办法std::function
在没有 RTTI 的情况下在 Clang 中使用lambdas?该文件说,只有target
和target_type
上std::function
应该需要RTTI。我可以推出自己的 版本std::function
,但不得不这样做似乎很可惜。
如果我将 MSVC 与编译器标志一起使用,它工作正常/GR-
。
在撰写 clang 时,他们的 Visual Studio 用户手册中有此文档:
cmake -G"Visual Studio 2017" -T LLVM ..
Run Code Online (Sandbox Code Playgroud)
这不起作用。
我从 cmake 收到了一条错误消息:
CMake Error at CMakeLists.txt:3 (project):
Failed to run MSBuild command:
C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/MSBuild/Current/Bin/MSBuild.exe
to get the value of VCTargetsPath:
Microsoft (R) Build Engine version 16.7.0+b89cb5fde for .NET Framework
Copyright (C) Microsoft Corporation. All rights reserved.
Build started 10/3/2020 5:06:06 PM.
Project "D:\Github\glfw\build\CMakeFiles\3.18.1\VCTargetsPath.vcxproj" on node 1 (default targets).
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppBuild.targets(411,5): error MSB8020: The build tools for LLVM99 (Platform Toolset …
Run Code Online (Sandbox Code Playgroud) CLang-CL 是 MSVC CL 的直接替代品。
有谁知道如何区分我的代码当前是由 clang-cl 还是 msvc 的 cl 编译的?无需在命令行上传递任何额外定义的宏。
使用
#ifdef _MSC_VER
//.....
#endif
Run Code Online (Sandbox Code Playgroud)
不起作用,两个编译器都定义了_MSC_VER。
此外,在 Linux 上的常规 CLang(Windows 也是如此)中,可以转储clang -dM -E - < /dev/null
所有定义的宏。但据我所知, clang-cl 和 msvc-cl 都没有这样的选项来转储所有定义的宏,所以我不知道有什么方法可以查看定义的宏列表中的差异,以便两个编译器找出使用哪个宏来区分这些编译器。
我用 cmake 和 msvc 构建了 Boringssl 然后我尝试用 clang-cl 构建所以我在 vmake 参数中使用了 -T"LLVM-vs2014"
Clang-cl 使用 cl 参数,但是 cmake 使用 gcc 样式参数而不添加 -Xclang
我使用的是 Windows 10、Visual Studio 2019、平台:x64,并且在单文件 Visual Studio 解决方案中具有以下测试脚本:
#include <iostream>
#include <intrin.h>
using namespace std;
int main() {
unsigned __int64 mask = 0x0fffffffffffffff; //1152921504606846975;
unsigned long index;
_BitScanReverse64(&index, mask);
if (index != 59) {
cout << "Fails!" << endl;
return EXIT_FAILURE;
}
else {
cout << "Success!" << endl;
return EXIT_SUCCESS;
}
}
Run Code Online (Sandbox Code Playgroud)
在我的属性解决方案中,我将“启用增强指令集”设置为“高级矢量扩展 2 (/arch:AVX2)”。当使用 msvc 编译(将“平台工具集”设置为“Visual Studio 2019 (v142)”)时,代码返回 EXIT_SUCCESS,但是当使用 clang-cl 编译(将“平台工具集”设置为“LLVM (clang-cl)”)时,我得到退出失败。调试 clang-cl 运行时,index 的值为 4,而它应该是 59。这表明 clang-cl 正在以与 MSVC 相反的方向读取位。
当我将“启用增强指令集”设置为“未设置”时,情况并非如此。在这种情况下,MSVC 和 clang-cl 都返回 EXIT_SUCCESS。
在所有情况下,所有 …