2015-12-30 4 views
1

Я только начал использовать clang-cl 3.7 на окнах. Я попытался скомпилировать свой код на моей машине WIN8.1 через Visual studio 2015 и через командную строку. Излишне говорить, что до этого, в том же cmd, я побежал vsvarsall с опцией amd64.clang-cl on WIndows 8.1 странная ошибка компиляции

Вот мой код:

#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. 
+1

'char16_t' и' char32_t' является добавлением C++ 11, вы скомпилировали с соответствующими флагами? – YSC

+0

какие флаги? Я так не думаю ... – user2554080

+0

my bad http://stackoverflow.com/questions/25992401/how-to-add-std-c11-flag-to-clang-cl (clang по умолчанию для C++ 11 on Windows). – YSC

ответ

6

Наконец-то я обнаружил, что мне нужно добавить в командную строку следующее:

-fms-compatibility-version=19.00 

В ответ на Clang bug report #24231, Рид Klecker объяснил, почему это необходимо:

"In [Visual Studio] 2015, char16_t became a builtin type. Previously, it could not be builtin because 2013 defines it in their headers. By default, Clang tries to be compatible with 2013. To target 2015, pass [ -fms-compatibility-version=19 ] to clang-cl . The argument can be the whole version number that cl /? spits out."

Так моя последняя команда (включая общие LIBS):

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" 
+0

Кажется, что после этого ответа они добавили средства автоматической установки '-fms-compatible-version' на основе ваших переменных среды (на самом деле, проверив номер версии cl.exe). Итак, убедитесь, что у вас есть cl .exe', видимый для clang, и эта опция будет установлена ​​автоматически. – thelink2012

+0

@ thelink2012 Предполагается, что это должно быть в Clang 4.0? Используя предварительно созданные двоичные файлы в Windows 10 с MSVC 2017 (cl.exe 19.10), параметр совместимости по умолчанию по умолчанию 18. –

+0

@DavidBrown Я нашел это поведение на Clang 3.9.1, не уверен, что они изменили его на 4.0. – thelink2012

Смежные вопросы