Как мне скомпилировать существующий проект MSVC с помощью компилятора Visual Studio 2022 Clang?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как мне скомпилировать существующий проект MSVC с помощью компилятора Visual Studio 2022 Clang?

Сообщение Anonymous »

У меня есть существующий проект C++, который нормально компилируется с помощью msvc, и я пытаюсь скомпилировать его в Visual Studio 2022 с помощью LLVM (clang-cl). На данный момент я использую предварительную версию стандарта языка C++ ISO C++23, хотя я не думаю, что это необходимо, и предпочел бы C++20.
Установщик Visual Studio сообщает мне, что у меня есть «Компилятор C++ Clang для Windows (19.1.5)» и «Поддержка MSBuild для набора инструментов LLVM (clang-cl)».
Проект не компилируется, он генерирует сотни ошибки компиляции. Некоторые популярные из них:
E0020 идентификатор «__bf16» не определен (в avx512bf16intrin.h, avxintrin.h и других)
E0020 глобальная область действия не имеет «int8_t» (в cstdint, xutility, _msvc_minmax.hpp и другие)
Идентификатор E0020 SETJTMP_FLOAT128 не определен (в setjtmp.h)
Что мне нужно сделать, чтобы преодолеть трудности? Конечно, ответ прост и продублирован на SO, но я гуглил 3 или 4 часа и, очевидно, не нашел подходящих ключевых слов для этой проблемы.

Вот небольшой пример, который имеет большинство одинаковых ошибок компиляции. Я начал подозревать, что мои проблемы во многом связаны с vcl Агнера, поэтому я просто добавил пример кода его диспетчера в новый проект и сорвал куш ошибки компиляции. Обратите внимание: по сравнению с точным кодом Агнера я делаю некоторые незначительные изменения в файлах instrset.h и instrset_detect.cpp, чтобы поставить clang поверх MSC. Код Агнера имеет clang ниже MSC и отлично работает для компиляции в автономном clang, но не в Visual Studio clang. Исходные файлы instrset.h и instrset_detect.cpp Агнера сохраняются в подкаталоге vcl_agner. Если вы их используете, вы по-прежнему получаете большинство тех же ошибок.
https://drive.google.com/file/d/1IElPqw ... drive_link

Вот пример с глупо-простым кодом SIMD. Он будет генерировать все «ошибки» компиляции intellisense, но будет компилироваться и работать правильно. Мой реальный код и код, указанный выше, не скомпилируются, но фатальные ошибки сборки — это ошибки компоновщика, которые не происходят при компиляции в msvc, а только при компиляции в clang. Поэтому я полагаю, что мне следует сосредоточиться на ошибках ссылок.
#include
#include
//#include

//#define SIMD_SIZE_SPN 8
#define SIMD_SIZE_SPN 4
//#define SIMD_SIZE_SPN 2

int main() {

printf("\nhello ms clang\n");

double xarr[SIMD_SIZE_SPN] = {};

#if SIMD_SIZE_SPN == 8
__m512d vec1, vec2;
vec1 = _mm512_setr_pd(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0);
vec2 = _mm512_setr_pd(8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0);
vec1 = _mm512_mul_pd(vec1, vec2); //8, 14, 18, 20, 20, 18, 14, 8
_mm512_storeu_pd(xarr, vec1);
#elif SIMD_SIZE_SPN == 4
__m256d vec1, vec2;
vec1 = _mm256_setr_pd(1.0, 2.0, 3.0, 4.0);
vec2 = _mm256_setr_pd(4.0, 3.0, 2.0, 1.0);
vec1 = _mm256_mul_pd(vec1, vec2); //4, 6, 6, 4
_mm256_storeu_pd(xarr, vec1);
#else
__m128d vec1, vec2;
vec1 = _mm_setr_pd(1.0, 2.0);
vec2 = _mm_setr_pd(2.0, 1.0);
vec1 = _mm_mul_pd(vec1, vec2); //2, 2
_mm_storeu_pd(xarr, vec1);
#endif

printf("\nlast = %8.2f \n", xarr[SIMD_SIZE_SPN - 1]); //8, 4, 2

return 0;
}


Подробнее здесь: https://stackoverflow.com/questions/797 ... o-2022-cla
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»