Clang не может собрать libc++ (переопределить nothrow_t, new, delete, new[], delete[] ) для нового MSVC 2019 и Windows SDK 10.0.17763.0

Кажется, конфликтуют 5 символов: nothrow_t, new, delete, new[], delete[].

[2/37] Building CXX object lib\CMakeFiles\cxx_shared.dir\__\src\algorithm.cpp.obj
FAILED: lib/CMakeFiles/cxx_shared.dir/__/src/algorithm.cpp.obj
C:\PROGRA~1\LLVM\bin\clang-cl.exe  /nologo -TP -DNDEBUG -D_ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH -D_ALLOW_MSC_VER_MISMATCH -D_CRTBLD -D_CRT_SECURE_NO_WARNINGS -D_CRT_STDIO_ISO_WIDE_SPECIFIERS -D_LIBCPP_BUILDING_LIBRARY -D_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER -IC:\Users\User\AppData\Roaming\libcxx-master\include -fms-compatibility-version=19.00 --target=x86_64--windows -D_LIBC_NO_VCRUNTIME -D_LIBCPP_NO_VCRUNTIME /MD /O2 /Ob2 /DNDEBUG   /std:c++14 -Wall -Wextra -W -Wwrite-strings -Wno-unused-parameter -Wno-long-long -Werror=return-type -Wextra-semi -Wno-user-defined-literals -Wno-covered-switch-default -Wno-c++98-compat -Wno-c++98-compat-pedantic -Wno-c++11-compat -Wno-undef -Wno-reserved-id-macro -Wno-gnu-include-next -Wno-gcc-compat -Wno-zero-as-null-pointer-constant -Wno-deprecated-dynamic-exception-spec -Wno-sign-conversion -Wno-old-style-cast -Wno-deprecated -Wno-shift-sign-overflow -Wno-double-promotion -Wno-error -EHsc /Zl /showIncludes /Folib\CMakeFiles\cxx_shared.dir\__\src\algorithm.cpp.obj /Fdlib\CMakeFiles\cxx_shared.dir\ -c C:\Users\User\AppData\Roaming\libcxx-master\src\algorithm.cpp
In file included from C:\Users\User\AppData\Roaming\libcxx-master\src\algorithm.cpp:10:
In file included from C:\Users\User\AppData\Roaming\libcxx-master\include\random:1645:
In file included from C:\Users\User\AppData\Roaming\libcxx-master\include\istream:163:
In file included from C:\Users\User\AppData\Roaming\libcxx-master\include\ostream:137:
In file included from C:\Users\User\AppData\Roaming\libcxx-master\include\ios:215:
In file included from C:\Users\User\AppData\Roaming\libcxx-master\include\__locale:23:
In file included from C:\Users\User\AppData\Roaming\libcxx-master\include\support/win32/locale_win32.h:15:
In file included from C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.20.27508\include\xlocinfo.h:6:
In file included from C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.20.27508\include\yvals.h:9:
In file included from C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\ucrt\crtdbg.h:13:
In file included from C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.20.27508\include\vcruntime_new_debug.h:10:
C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.20.27508\include\vcruntime_new.h(34,16): error: redefinition of 'nothrow_t'
    struct nothrow_t {
           ^
C:\Users\User\AppData\Roaming\libcxx-master\include\new(123,25): note: previous definition is here
struct _LIBCPP_TYPE_VIS nothrow_t {};
                        ^

Это мой CMAKE. (тоже пробовал 19.20)

cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_MAKE_PROGRAM = "C:/Program Files (x86)/Ninja/ninja.exe" 
-DCMAKE_SYSTEM_NAME=Windows -DCMAKE_C_COMPILER = "C:/Program Files/LLVM/bin/clang-cl.exe" 
-DCMAKE_C_FLAGS = "-fms-compatibility-version=19.00 --target=x86_64--windows -D_LIBC_NO_VCRUNTIME" 
-DCMAKE_CXX_COMPILER = "C:/Program Files/LLVM/bin/clang-cl.exe" 
-DCMAKE_CXX_FLAGS = "-fms-compatibility-version=19.00 --target=x86_64--windows -D_LIBC_NO_VCRUNTIME -D_LIBCPP_NO_VCRUNTIME" 
-DCMAKE_C_LINK_EXECUTABLE = "C:/Program Files/LLVM/bin/lld-link.exe" 
-DCMAKE_CXX_LINK_EXECUTABLE = "C:/Program Files/LLVM/bin/lld-link.exe" 
-DLLVM_USE_LINKER = "C:/Program Files/LLVM/bin/lld-link.exe" 
-DLLVM_PATH = "C:/Program Files/LLVM" -DLIBCXX_ENABLE_SHARED=YES 
-DLIBCXX_ENABLE_STATIC=NO -DLIBCXX_ENABLE_EXPERIMENTAL_LIBRARY=YES 
"C:/Users/User/AppData/Roaming/libcxx-master"

Это мой SDK

set LIB=C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.20.27508\lib\x64;
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.17763.0\ucrt\x64;
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.17763.0\um\x64

Могу ли я заставить его работать? Куда отправить выпуск кому?

Вы используете [clang], а не [visual-c++]. Ожидание того, что один компилятор обрадуется файлам #include другого, приведет к слезам. Если вы хотите использовать Clang, вам следует установить его специфичный для VS вариант. Вернитесь к установщику, выберите Modify. Флажок должен находиться на вкладках «Отдельные компоненты». Раньше в VS2017 назывался «Clang/C2».

Hans Passant 07.04.2019 23:49

@HansPassant Этот набор параметров CMAKE отлично работает с MSVC 2017. Я успешно строил его раньше. Мне просто интересно, как я могу заставить его работать с MSVC 2019?

sandthorn 07.04.2019 23:58
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
490
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У меня такая же проблема с VS2019. Я удалил флаги no_runtime, но установил -DCMAKE_C_LINK_EXECUTABLE = "lld-link.exe -flavor link" ^ -DCMAKE_CXX_LINK_EXECUTABLE = "lld-link.exe -flavor link" ^ Добавлен -flavor link, и он успешно связан. Я не тестировал исключения, но тестировал программу с std::thread, компилируется и работает так же, как и с cl компилятором.

UPD: базовый try-catch с std::exception throwed работает

UPD: полный пакет cmake (ваши пути могут отличаться!)

cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_MAKE_PROGRAM = "D:/Programming/ninja-build/ninja.exe" ^
-DCMAKE_SYSTEM_NAME=Windows -DCMAKE_C_COMPILER = "clang-cl.exe" ^
-DCMAKE_C_FLAGS = "-fms-compatibility-version=19.00 --target=x86_64--windows" ^
-DCMAKE_CXX_COMPILER = "clang-cl.exe" ^
-DCMAKE_CXX_FLAGS = "-fms-compatibility-version=19.00 --target=x86_64--windows " ^
-DCMAKE_C_LINK_EXECUTABLE = "lld-link.exe -flavor link" ^
-DCMAKE_CXX_LINK_EXECUTABLE = "lld-link.exe -flavor link" ^
-DLLVM_USE_LINKER = "lld-link.exe" ^
-DLLVM_PATH = "C:/Program Files/LLVM" -DLIBCXX_ENABLE_SHARED=YES ^
-DLIBCXX_ENABLE_STATIC=NO -DLIBCXX_ENABLE_EXPERIMENTAL_LIBRARY=YES ^
"D:\Programming\cpp_sandbox\libcxx-9.0.0.src"

Пробовал без -flavor link, тоже работает, Что делает -flavor link?

sandthorn 23.02.2020 11:39

Он указывает компоновщику clang использовать компоновщик MSVC. Теперь есть другая проблема - я не могу использовать эту библиотеку без MSVC, потому что она не может #include_next <wchar.h>, хотя я пытался добавить -MT к флагам компоновщика - это не помогает, просто нужно, чтобы некоторые "другие" системные заголовки были (но Я не хочу, чтобы MSVC присутствовал на моем ПК...). Может быть, у вас есть идея, как построить его полностью самостоятельно?

Max Vlasov 23.02.2020 13:12

Я никогда не пробовал это сам, но я думаю, что вы можете попробовать clang++ --driver-mode=g++ со статической стандартной библиотекой msys2 gcc libstdc++.a => пакеты.msys2.org/package/mingw-w64-x86_64-gcc . Тем не менее, я уверен, что в любом случае будет зависеть от ОС msvcrt.dll (NT CRT, а не Visual Studio).

sandthorn 24.02.2020 05:42

@sandthorn проблема в том, что по умолчанию clang вызывает компоновщик с -deafultlib:libcmt, и я понятия не имею, как это исправить, кроме как разделить сборку на clang -c... и lld-link -defaultlib:msvcrt...

Max Vlasov 24.02.2020 10:25

@sandthorn, не могли бы вы также показать мне пример сборки с использованием библиотеки NT?

Max Vlasov 24.02.2020 12:49

Другие вопросы по теме