Импортировать 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.

8
4

  • @NicolBolas, вы пытаетесь не понять вопрос? Насколько я понимаю, должен быть способ сопоставить stl-includes с импортом c ++ 20, но я больше не могу ...
2
Общее количество ответов: 2

Ответ #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++.

11
0

Ответ #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 
#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 по импорту заголовков в виде модулей.

6
1

  • Если вы переименуете `module.modulemap` в` module.cc`, то эта команда сгенерирует `std_mod.pcm`: `clang -Xclang -emit-module -std = c ++ 20 -c module.cc -o std_mod.pcm -fmodules ...