Импортировать std lib как модули с clang
Я экспериментирую с модулями в clang и хотел 9X_c++2a бы включить стандартную библиотеку как модули, а 9X_c++-modules не как включаемые.
Сейчас я этим занимаюсь
#include #include
It seems that you in msvc 9X_cpp должен иметь возможность импортировать стандартные 9X_c++ библиотеки, например,
import std.core;
Однако при использовании 9X_c++-modules clang это, похоже, не реализовано или реализовано 9X_c++2a другим способом.
У меня вопрос: можно ли 9X_c++ импортировать stl-includes, как предлагает 9X_c++-modules Microsoft, или можно сопоставить стандартные 9X_clang++ lib-включения с модулями somhow.
Примечание. Я 9X_c++-modules не могу использовать #include <...>
или #import <...>
из-за других 9X_c++20 ошибок, которые могут вызвать отдельный 9X_cpp вопрос. Поэтому я думаю, что получить import std.core
или 9X_c++2a что-то подобное - это то, что нужно сейчас, если 9X_c++2a это возможно.
ModernesCpp также упоминает std.core.
- @NicolBolas, вы пытаетесь не понять вопрос? Насколько я понимаю, должен быть способ сопоставить stl-includes с импортом c ++ 20, но я больше не могу ...
Ответ #1
Ответ на вопрос: Импортировать std lib как модули с clang
Стандарт C++ 20 не включает определения 9X_c++ модулей для стандартной библиотеки C++. Visual 9X_clang++ Studio делает (к сожалению), и многие плохие сайты 9X_cxx будут вести себя так, как будто это стандартно. Но 9X_c++ это не так; это просто вещь Microsoft.
Если 9X_c++20 вы хотите включить стандартную библиотеку 9X_c++ C++ через модуль для разных платформ, вам 9X_c++-modules придется либо использовать синтаксис import
, либо 9X_c++ написать собственные модули стандартной 9X_c++2a библиотеки, которые импортируют заголовки 9X_cpp и экспортируют определенные объявления C++.
Ответ #2
Ответ на вопрос: Импортировать std lib как модули с clang
Решил вашу задачу. Ниже приведены инструкции 9X_clang++ для этого. Я сделал это на своем 64-битном 9X_c++20 Win 10, используя CLang из текущей версии 9X_cxx LLVM 12.0 (взято из here), также у меня установлено 9X_c++20 сообщество MSVC 2019 v16.9.4 (взято из here).
Сначала 9X_cpp создайте следующие файлы:
module.modulemap:
module std_mod { requires cplusplus17 header "std_mod.hpp" export * }
std_mod.hpp:
#include #include
use.cpp:
import std_mod; int main() { std::cout << "Hello, World!" << std::endl; }
В приведенном 9X_c++ выше файле std_mod.hpp
вы можете поместить любые заголовки 9X_c++ std, которые вам нужны. Вы должны поместить 9X_c++20 все возможные заголовки STD, которые вы 9X_clang++ используете во всех своих проектах, чтобы 9X_cpp иметь возможность использовать один и тот 9X_clang++ же предварительно скомпилированный модуль 9X_c++20 STD повсюду.
Затем выполните команду:
clang++ -### use.cpp -c -std=c++20 -m64 -g -O3 >use.txt 2>&1
Здесь 9X_clang++ вместо -std=c++20 -m64 -g -O3
вы можете использовать любые параметры, необходимые 9X_cxx для вашего проекта. Каждый предварительно 9X_cxx скомпилированный модуль должен иметь те 9X_c++ же параметры компиляции, что и другие файлы 9X_cpp .cpp, чтобы его можно было связать в окончательный 9X_c++ двоичный файл.
Приведенная выше команда создаст 9X_clang++ use.txt
с параметрами, которые вам нужно скопировать. В 9X_c++2a этих параметрах вы должны удалить параметр 9X_cpp -emit-obj
, параметр -o
(и путь после него), а также 9X_cxx удалить use.cpp
. Затем добавьте в эту команду строку 9X_cxx параметров module.modulemap -o std_mod.pcm -emit-module -fmodules -fmodule-name=std_mod
. В моей системе я получил следующую 9X_cxx команду:
"D:\\bin\\llvm\\bin\\clang++.exe" "-cc1" module.modulemap -o std_mod.pcm -emit-module -fmodules -fmodule-name=std_mod "-triple" "x86_64-pc-windows-msvc19.28.29914" "-mincremental-linker-compatible" "--mrelax-relocations" "-disable-free" "-disable-llvm-verifier" "-discard-value-names" "-main-file-name" "use.cpp" "-mrelocation-model" "pic" "-pic-level" "2" "-mframe-pointer=none" "-fmath-errno" "-fno-rounding-math" "-mconstructor-aliases" "-munwind-tables" "-target-cpu" "x86-64" "-tune-cpu" "generic" "-gno-column-info" "-gcodeview" "-debug-info-kind=limited" "-resource-dir" "D:\\bin\\llvm\\lib\\clang\\12.0.0" "-internal-isystem" "D:\\bin\\llvm\\lib\\clang\\12.0.0\\include" "-internal-isystem" "d:\\bin2\\Microsoft Visual Studio\\2019\\Community\\VC\\Tools\\MSVC\\14.28.29910\\include" "-internal-isystem" "d:\\bin2\\Microsoft Visual Studio\\2019\\Community\\VC\\Tools\\MSVC\\14.28.29910\\atlmfc\\include" "-internal-isystem" "D:\\Windows Kits\\10\\Include\\10.0.19041.0\\ucrt" "-internal-isystem" "D:\\Windows Kits\\10\\include\\10.0.19041.0\\shared" "-internal-isystem" "D:\\Windows Kits\\10\\include\\10.0.19041.0\\um" "-internal-isystem" "D:\\Windows Kits\\10\\include\\10.0.19041.0\\winrt" "-O3" "-std=c++20" "-fdeprecated-macro" "-fdebug-compilation-dir" "D:\\t\\t4" "-ferror-limit" "19" "-fno-use-cxa-atexit" "-fms-extensions" "-fms-compatibility" "-fms-compatibility-version=19.28.29914" "-fdelayed-template-parsing" "-fno-implicit-modules" "-fcxx-exceptions" "-fexceptions" "-vectorize-loops" "-vectorize-slp" "-faddrsig" "-x" "c++"
Как видите, эта команда содержит 9X_c++ полные пути для включения, они необходимы. Выполните 9X_c++-modules команду выше, она создаст std_mod.pcm
, который вы можете 9X_c++ использовать в своих проектах везде с одинаковыми 9X_c++ параметрами компиляции.
Зачем нужна длинная 9X_cxx команда выше? Поскольку использование файла 9X_c++2a .modulemap
возможно только с помощью команды -cc1
, которая 9X_c++ выполняет низкоуровневый интерфейс CLang 9X_c++20 вместо упрощенного драйвера CLang (драйвер 9X_clang++ не имеет опции -cc1
). Этот низкоуровневый интерфейс 9X_c++-modules позволяет выполнять множество трюков, недоступных 9X_clang++ для драйвера.
Теперь вы можете скомпилировать 9X_cxx свою последнюю программу use.cpp
, которая выполняет 9X_c++2a import std_mod;
, следующей командой:
clang++ use.cpp -o use.exe -std=c++20 -m64 -g -O3 -fmodule-file=std_mod.pcm
Видите, я добавил -fmodule-file=std_mod.pcm
- такая 9X_cpp опция нужна для каждого импортированного 9X_c++20 модуля. В качестве альтернативы вы можете 9X_c++20 использовать -fprebuilt-module-path=
, чтобы указать, где искать 9X_cxx все готовые модули.
Не так давно я также 9X_c++-modules создал вопрос и ответ here о том, как создавать 9X_c++ модули из заголовков в CLang.
Для получения 9X_c++-modules дополнительных инструкций по модулям см. Modules Doc и 9X_c++ CommandLine Doc от CLang.
PS. Почему я применил довольно длинное 9X_clang++ решение выше? Потому что, по крайней мере, в 9X_c++20 Windows 'CLang следующая простая программа
import ; int main() {}
не 9X_cxx компилируется, отображается use.cpp:1:8: error: header file (aka 'd:\bin2\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29910\include\iostream') cannot be imported because it is not known to be a header unit
. Так что, по 9X_cxx крайней мере, для Win нужно особое решение, решение 9X_clang++ с import ;
здесь не работает.
Все заголовки, импортированные 9X_cpp с помощью синтаксиса import
;
или import "header";
, должны иметь 9X_c++-modules специальные скомпилированные модули модулей 9X_c++2a заголовков, помещенные в специальную папку 9X_c++20 для использования. А в заголовках Win STD 9X_clang++ нет соответствующих скомпилированных модулей 9X_clang++ заголовков. Также, потратив много часов, я 9X_cpp не нашел в CLang способа создавать эти так 9X_c++2a называемые блоки заголовков в Win. Только 9X_cpp решение, приведенное выше, решило мою задачу 9X_c++2a по импорту заголовков в виде модулей.
- Если вы переименуете `module.modulemap` в` module.cc`, то эта команда сгенерирует `std_mod.pcm`: `clang -Xclang -emit-module -std = c ++ 20 -c module.cc -o std_mod.pcm -fmodules ...
-
2
-
6
-
2
-
1
-
1
-
2
-
1
-
3
-
2
-
2
-
2
-
1
-
7
-
2
-
3
-
4
-
4
-
4
-
1
-
2
-
2
-
2
-
1
-
1
-
1
-
4
-
4
-
3
-
4
-
2
-
1
-
1
-
2
-
2
-
4
-
2
-
1
-
2
-
23
-
3
-
3
-
5
-
4
-
2
-
3
-
2
-
1
-
1
-
2
-
3