Windows 8.1上的clang cl编译错误

clang-cl on Windows 8.1 compiling error

本文关键字:cl 编译 错误 clang 上的 Windows      更新时间:2023-10-16

我刚开始在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 FilesLLVMbin>"C:Program FilesLLVMbinclang-cl.exe"     "C:UsersDav
 idSourceReposDY Obfuscator 2015-20162DY ObfuscatorSource.cpp"

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

C:Program FilesLLVMbin>"C:Program FilesLLVMbinclang-cl.exe"    C:testSourc
e.cpp
In file included from C:testSource.cpp:3:
In file included from C:Program Files (x86)Microsoft Visual Studio  14.0VCINC
LUDEiostream:6:
In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
LUDEistream:6:
In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
LUDEostream:6:
In file included from C:Program Files (x86)Microsoft Visual Studio   14.0VCINC
LUDEios:6:
In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
LUDExlocnum:7:
In file included from C:Program Files (x86)Microsoft Visual Studio   14.0VCINC
LUDEcmath:656:
In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
LUDExtgmath.h:8:
C:Program Files (x86)Microsoft Visual Studio     14.0VCINCLUDExtr1common(207,22
) :  error:
  use of undeclared identifier 'char16_t'
    struct _Is_integral<char16_t>
                        ^
C:Program Files (x86)Microsoft Visual Studio   14.0VCINCLUDExtr1common(213,22
) :  error:
  use of undeclared identifier 'char32_t'
    struct _Is_integral<char32_t>
                        ^
In file included from C:testSource.cpp:3:
In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
LUDEiostream:6:
In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
LUDEistream:6:
In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
LUDEostream:6:
In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
 LUDEios:6:
In file included from C:Program Files (x86)Microsoft Visual Studio    14.0VCINC
 LUDExlocnum:10:
 In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
LUDEstreambuf:6:
In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
LUDExiosbase:6:
In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
LUDExlocale:8:
In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
LUDEstdexcept:6:
In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
LUDEexception:7:
 In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
 LUDEtype_traits:6:
 C:Program Files (x86)Microsoft Visual Studio   14.0VCINCLUDExstddef(405,14) :
  error:
  use of undeclared identifier 'char16_t'
    struct hash<char16_t>
                ^
 C:Program Files (x86)Microsoft Visual Studio 14.0VCINCLUDExstddef(411,14) :
   error:
  use of undeclared identifier 'char32_t'
    struct hash<char32_t>
                ^
 In file included from C:testSource.cpp:3:
 In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
 LUDEiostream:6:
 In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
 LUDEistream:6:
 In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
  LUDEostream:6:
 In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
 LUDEios:6:
 In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
 LUDExlocnum:10:
In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
 LUDEstreambuf:6:
In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
 LUDExiosbase:6:
In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
 LUDExlocale:8:
In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
 LUDEstdexcept:7:
In file included from C:Program Files (x86)Microsoft Visual Studio  14.0VCINC
LUDExstring:6:
 In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
 LUDExmemory0:8:
 C:Program Files (x86)Microsoft Visual Studio 14.0VCINCLUDElimits(611,33) :
  error:
  use of undeclared identifier 'char16_t'
 template<> class numeric_limits<char16_t>
                            ^
 C:Program Files (x86)Microsoft Visual Studio 14.0VCINCLUDElimits(901,33) :
  error:
  use of undeclared identifier 'char32_t'
 template<> class numeric_limits<char32_t>
                            ^
 In file included from C:testSource.cpp:3:
In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
  LUDEiostream:6:
 In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
 LUDEistream:6:
 In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
 LUDEostream:6:
 In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
 LUDEios:6:
 In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
 LUDExlocnum:10:
 In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
 LUDEstreambuf:6:
 In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
 LUDExiosbase:6:
 In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
 LUDExlocale:8:
 In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
 LUDEstdexcept:7:
 In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
 LUDExstring:6:
 In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
 LUDExmemory0:10:
 In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
 LUDExutility:8:
 In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
 LUDEutility:7:
 C:Program Files (x86)Microsoft Visual Studio 14.0VCINCLUDEiosfwd(267,21) :
  error:
  use of undeclared identifier 'char16_t'
    struct char_traits<char16_t>
                       ^
  C:Program Files (x86)Microsoft Visual Studio 14.0VCINCLUDEiosfwd(276,21) :
   error:
   use of undeclared identifier 'char32_t'
    struct char_traits<char32_t>
                       ^
 In file included from C:testSource.cpp:3:
 In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
 LUDEiostream:6:
 In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
  LUDEistream:6:
 In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
  LUDEostream:6:
  In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
 LUDEios:6:
  In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
LUDExlocnum:10:
 In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
 LUDEstreambuf:6:
 In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
 LUDExiosbase:6:
 In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
 LUDExlocale:8:
 In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
 LUDEstdexcept:7:
 C:Program Files (x86)Microsoft Visual Studio 14.0VCINCLUDExstring(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.0VCINCLUDExstring(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.0VCINCLUDExstring(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.0VCINCLUDExstring(2625,53)
 :  error:
  expected unqualified-id
 typedef basic_string<char32_t, char_traits<char32_t>, allocator<char32_t> >
                                                ^
In file included from C:testSource.cpp:3:
In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
LUDEiostream:6:
In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
 LUDEistream:6:
 In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
 LUDEostream:6:
  In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
 LUDEios:6:
  In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
 LUDExlocnum:10:
 In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
 LUDEstreambuf:6:
 In file included from C:Program Files (x86)Microsoft Visual Studio 14.0VCINC
 LUDExiosbase:6:
  C:Program Files (x86)Microsoft Visual Studio 14.0VCINCLUDExlocale(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.0VCINCLUDExlocale(1328,30)
 :  error:
  use of undeclared identifier 'char32_t'
    class _CRTIMP2_PURE codecvt<char32_t, char, _Mbstatet>
                                ^
 14 errors generated.

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

-fms-compatibility-version=19.00

Reid Klecker在回复Clang错误报告#24231时解释了为什么这是必要的:

"在〔Visual Studio〕2015中,char16_t成为内置类型。以前,它不能内置,因为2013在它们的标头中定义了它。默认情况下,Clang尝试与2013兼容。要实现2015年目标,请将[-fms-compatibility-version=19]传递给clang-cl。参数可以是cl /?吐出的整个版本号。"

所以我的最后命令是(包括一般的libs):

clang-cl.exe "C:testSource.cpp" -fms-compatibility-version=19.00 ^
   -Fe"C:testSource.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"