Nano Hash - криптовалюты, майнинг, программирование

C ++ - цепочка импорта модулей приводит к странным ошибкам компилятора

При компиляции c ++ - 20 модулей с clang. Я получаю странные ошибки компиляции при импорте файла, который импортирует другой файл, который импортирует третий файл, например:

// a.cppm
#include <string>

export module a;

export std::string getStuffA() {
  return "a";
}
// b.cppm
#include <string>

import a;

export module b;

export std::string getStuffB() {
  return "b" + getStuffA();
}
// c.cpp
#include <string>

import b;

int main() {
  std::cout << getStuffB() << std::endl;
  return 0;
}

Компилятор выводит:

In file included from ./src/c.cpp:1:
In file included from /usr/bin/../lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/iostream:39:
In file included from /usr/bin/../lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/ostream:38:
In file included from /usr/bin/../lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/ios:44:
In file included from /usr/bin/../lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/bits/basic_ios.h:37:
/usr/bin/../lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/bits/locale_facets.h:2569:5: error: inline declaration of 'isspace' follows non-inline definition

И он перечисляет еще несколько функций, которые, кажется, имеют как встроенное, так и не встроенное определение, например isprint, iscntrl, isupper.

Есть ли способ обойти эти ошибки.

Примечание. Удаление std::string и #include <string> удаляет ошибки компиляции, поэтому я думаю, что ошибки исходят от <string>


  • Поддержка модуля выглядит так, как будто ему нужен gcc 11, см. gcc.gnu.org/projects/cxx-status .html 28.02.2021
  • Итак, вам нужны заголовки gcc 11? 28.02.2021
  • Я не уверен; поддержка компилятора (только языковая поддержка) - это не то же самое, что поддержка стандартной библиотеки - вам нужно будет проверить и то, и другое. 28.02.2021
  • См. Также stackoverflow.com/questions / 66411157 / ... Стандарт C ++ 20 не включает определения модулей для стандартной библиотеки C ++ ... 28.02.2021
  • @RichardCritten Нет, я знаю, но вы должны уметь пользоваться стандартной библиотекой каким-то образом. 28.02.2021
  • @ S.M. Я попробую -stdlib = c ++ и вернусь с ответом 28.02.2021
  • Извините, я ошибся, это должно быть -stdlib=libc++ 28.02.2021
  • @ S.M. Да никакая опора не нашла это с некоторым поиском в Google. Это решает проблему. Спасибо! Думаю, если вы напишете это как обычный ответ, я приму это :) 28.02.2021
  • @ S.M. Фиксированный. Пытался скинуть минимальный жизнеспособный пример в редакторе ... 28.02.2021

Ответы:


1

Как уже было сказано, модули поддерживаются в gcc 11, и вы пытаетесь использовать clang со стандартной библиотекой C ++ gcc 10.

При использовании соответствующей стандартной библиотеки C ++ директивы включения препроцессора, такие как #include <string>, будут автоматически сопоставлены с import <string>;. При использовании стандартной библиотеки C ++ для gcc 10, которая не поддерживает модули, вы получите такие же ошибки, как и у вас.

Если вы используете clang, который поддерживает модули, и кажется, что вы используете такой современный clang, иначе вы получите другие ошибки в директиве импорта, вам следует использовать стандартную библиотеку clang C ++: -stdlib=libc++.

28.02.2021
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..