Я экспериментирую с функцией "модулей" Clang и пытаюсь скомпилировать следующий фрагмент кода:
export module a;
#include <new>
export void *foo()
{
return ::operator new(1, std::align_val_t(1));
}
export int main() {}
Попробуйте жить
Когда я попытался clang++ -std=c++2a -pedantic-errors -fmodules-ts --precompile -x c++-module a.cpp -o a.pcm
, я получил
error: ISO C++ requires a definition in this translation unit for function 'operator new'
because its type does not have linkage [-Werror,-Wundefined-internal-type]
a.cpp:7:14: note: used here
return ::operator new(1, std::align_val_t(1));
^
1 error generated.
Удаление -pedantic-errors
исправляет ошибку, но когда я пытаюсь связать полученный модуль с помощью clang++ -std=c++2a -fmodules-ts a.pcm -o a.exe
, я получаю
Z:\Lander\msys2\tmp\a-cfaf65.o:a.pcm:(.text+0x10): undefined reference to
`_ZnwyW1aESt11align_val_t'
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
Это особенно раздражает, поскольку <iostream>
(косвенно), похоже, полагается на выровненный operator new
, поэтому я не могу использовать его и в модулях. А также некоторые другие стандартные заголовки.
Что здесь происходит?
Если это ошибка Clang, как я могу ее обойти?
My Clang - последняя версия, предоставленная MSYS2:
# clang++ --version
clang version 8.0.0 (tags/RELEASE_800/final)
Target: x86_64-w64-windows-gnu
Thread model: posix
EDIT:
Подано отчет об ошибке , посмотрим, что получится ...