【问题标题】:clang-cl on Windows 8.1 compiling errorWindows 8.1 上的 clang-cl 编译错误
【发布时间】:2016-04-04 12:27:50
【问题描述】:

我刚开始在 Windows 上使用 clang-cl 3.7。 我尝试通过 Visual Studio 2015 和低谷命令行在我的 WIN8.1 机器上编译我的代码。不用说,在此之前,在同一个 cmd 中,我使用 amd64 选项运行了 vsvarsall

这是我的代码:

#define UNICODE
#include <Windows.h>
#include <iostream>

 int main() {

 int a = 0;
 if(0)
__asm _emit 0xE8
else
a=3;

if (IsDebuggerPresent())
MessageBox(
    NULL,
    (LPCWSTR)L"Debugger detected!!",
    (LPCWSTR)L"!!!!!",
    MB_ICONWARNING | MB_CANCELTRYCONTINUE | MB_DEFBUTTON2
    );
 return 0;
 }

这是我在命令行中输入的内容:

C:\Program Files\LLVM\bin>"C:\Program Files\LLVM\bin\clang-cl.exe"     "C:\Users\Dav
 id\Source\Repos\DY Obfuscator 2015-20162\DY Obfuscator\Source.cpp"

在 VS2015 中编译工作正常,但我无法在命令行上编译,因为我收到此错误:

C:\Program Files\LLVM\bin>"C:\Program Files\LLVM\bin\clang-cl.exe"    C:\test\Sourc
e.cpp
In file included from C:\test\Source.cpp:3:
In file included from C:\Program Files (x86)\Microsoft Visual Studio  14.0\VC\INC
LUDE\iostream:6:
In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
LUDE\istream:6:
In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
LUDE\ostream:6:
In file included from C:\Program Files (x86)\Microsoft Visual Studio   14.0\VC\INC
LUDE\ios:6:
In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
LUDE\xlocnum:7:
In file included from C:\Program Files (x86)\Microsoft Visual Studio   14.0\VC\INC
LUDE\cmath:656:
In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
LUDE\xtgmath.h:8:
C:\Program Files (x86)\Microsoft Visual Studio     14.0\VC\INCLUDE\xtr1common(207,22
) :  error:
  use of undeclared identifier 'char16_t'
    struct _Is_integral<char16_t>
                        ^
C:\Program Files (x86)\Microsoft Visual Studio   14.0\VC\INCLUDE\xtr1common(213,22
) :  error:
  use of undeclared identifier 'char32_t'
    struct _Is_integral<char32_t>
                        ^
In file included from C:\test\Source.cpp:3:
In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
LUDE\iostream:6:
In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
LUDE\istream:6:
In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
LUDE\ostream:6:
In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
 LUDE\ios:6:
In file included from C:\Program Files (x86)\Microsoft Visual Studio    14.0\VC\INC
 LUDE\xlocnum:10:
 In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
LUDE\streambuf:6:
In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
LUDE\xiosbase:6:
In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
LUDE\xlocale:8:
In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
LUDE\stdexcept:6:
In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
LUDE\exception:7:
 In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
 LUDE\type_traits:6:
 C:\Program Files (x86)\Microsoft Visual Studio   14.0\VC\INCLUDE\xstddef(405,14) :
  error:
  use of undeclared identifier 'char16_t'
    struct hash<char16_t>
                ^
 C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\xstddef(411,14) :
   error:
  use of undeclared identifier 'char32_t'
    struct hash<char32_t>
                ^
 In file included from C:\test\Source.cpp:3:
 In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
 LUDE\iostream:6:
 In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
 LUDE\istream:6:
 In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
  LUDE\ostream:6:
 In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
 LUDE\ios:6:
 In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
 LUDE\xlocnum:10:
In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
 LUDE\streambuf:6:
In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
 LUDE\xiosbase:6:
In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
 LUDE\xlocale:8:
In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
 LUDE\stdexcept:7:
In file included from C:\Program Files (x86)\Microsoft Visual Studio  14.0\VC\INC
LUDE\xstring:6:
 In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
 LUDE\xmemory0:8:
 C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\limits(611,33) :
  error:
  use of undeclared identifier 'char16_t'
 template<> class numeric_limits<char16_t>
                            ^
 C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\limits(901,33) :
  error:
  use of undeclared identifier 'char32_t'
 template<> class numeric_limits<char32_t>
                            ^
 In file included from C:\test\Source.cpp:3:
In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
  LUDE\iostream:6:
 In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
 LUDE\istream:6:
 In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
 LUDE\ostream:6:
 In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
 LUDE\ios:6:
 In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
 LUDE\xlocnum:10:
 In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
 LUDE\streambuf:6:
 In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
 LUDE\xiosbase:6:
 In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
 LUDE\xlocale:8:
 In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
 LUDE\stdexcept:7:
 In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
 LUDE\xstring:6:
 In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
 LUDE\xmemory0:10:
 In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
 LUDE\xutility:8:
 In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
 LUDE\utility:7:
 C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\iosfwd(267,21) :
  error:
  use of undeclared identifier 'char16_t'
    struct char_traits<char16_t>
                       ^
  C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\iosfwd(276,21) :
   error:
   use of undeclared identifier 'char32_t'
    struct char_traits<char32_t>
                       ^
 In file included from C:\test\Source.cpp:3:
 In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
 LUDE\iostream:6:
 In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
  LUDE\istream:6:
 In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
  LUDE\ostream:6:
  In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
 LUDE\ios:6:
  In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
LUDE\xlocnum:10:
 In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
 LUDE\streambuf:6:
 In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
 LUDE\xiosbase:6:
 In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
 LUDE\xlocale:8:
 In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
 LUDE\stdexcept:7:
 C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\xstring(2623,22)
  :  error:
  use of undeclared identifier 'char16_t'
 typedef basic_string<char16_t, char_traits<char16_t>, allocator<char16_t> >
                 ^
  C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\xstring(2623,53)
  :  error:
  expected unqualified-id
 typedef basic_string<char16_t, char_traits<char16_t>, allocator<char16_t> >
                                                ^
 C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\xstring(2625,22)
 :  error:
  use of undeclared identifier 'char32_t'
typedef basic_string<char32_t, char_traits<char32_t>, allocator<char32_t> >
                 ^
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\xstring(2625,53)
 :  error:
  expected unqualified-id
 typedef basic_string<char32_t, char_traits<char32_t>, allocator<char32_t> >
                                                ^
In file included from C:\test\Source.cpp:3:
In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
LUDE\iostream:6:
In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
 LUDE\istream:6:
 In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
 LUDE\ostream:6:
  In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
 LUDE\ios:6:
  In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
 LUDE\xlocnum:10:
 In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
 LUDE\streambuf:6:
 In file included from C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INC
 LUDE\xiosbase:6:
  C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\xlocale(1004,30)
  :  error:
  use of undeclared identifier 'char16_t'
    class _CRTIMP2_PURE codecvt<char16_t, char, _Mbstatet>
                                ^
  C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\xlocale(1328,30)
 :  error:
  use of undeclared identifier 'char32_t'
    class _CRTIMP2_PURE codecvt<char32_t, char, _Mbstatet>
                                ^
 14 errors generated.

【问题讨论】:

  • char16_tchar32_t 是 C++11 的补充,你用相关标志编译了吗?
  • 什么标志?我不这么认为......
  • 我的错误stackoverflow.com/questions/25992401/…(clang 在 Windows 上默认为 C++11)。
  • 我在命令中添加了-Xclang -std=c++11-Xclang -std=c++14,但这并没有帮助! :(

标签: c++ windows compilation 64-bit clang


【解决方案1】:

我终于发现需要在命令行中添加以下内容:

-fms-compatibility-version=19.00

在回复Clang bug report #24231 时,Reid Klecker 解释了为什么这是必要的:

“在 [Visual Studio] 2015 中,char16_t 成为内置类型。以前,它无法内置,因为 2013 在其标题中定义了它。默认情况下,Clang 尝试与 2013 兼容。要针对 2015,请通过[-fms-compatibility-version=19] 到clang-cl。参数可以是cl /? 吐出的整个版本号。”

所以我的最终命令是(包括通用库):

clang-cl.exe "C:\test\Source.cpp" -fms-compatibility-version=19.00 ^
   -Fe"C:\test\Source.exe" "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" ^
   "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" ^
   "odbc32.lib" "odbccp32.lib"

【讨论】:

  • 似乎自此回复以来,他们添加了根据您的环境变量自动设置-fms-compatibility-version 的方法(实际上是通过检查cl.exe 版本号)。因此,请确保您有 cl.exe 对 clang 可见,并且此选项将自动设置。
  • @thelink2012 那应该在 Clang 4.0 中吗?在带有 MSVC 2017 (cl.exe 19.10) 的 Windows 10 上使用预构建的二进制文件,兼容性设置仍默认为 18。
  • @DavidBrown 我在 Clang 3.9.1 上发现了这种行为,不确定他们是否在 4.0 上进行了更改。
猜你喜欢
  • 1970-01-01
  • 2018-03-24
  • 2013-07-25
  • 2020-06-07
  • 2013-01-31
  • 1970-01-01
  • 2018-05-12
  • 1970-01-01
  • 2012-03-14
相关资源
最近更新 更多