С++ неопределенная ссылка, класс не имеет тега ABI cxx11, который имеет «std::string»

Для личного проекта, гитарной педали Raspberry Pi, я создаю небольшую библиотеку. Эта библиотека содержит кучу классов, определяющих функцию нескольких типов эффектов. Для этого у меня есть базовый класс Effect, от которого наследуется каждый эффект, вместе с базовым классом EffectFactory, который будет создавать последовательности эффектов на основе файла конфигурации. Я использую С++, язык, в котором я совсем новичок, поскольку я обычно использую JavaScript.

EffectFactory состоит из карты строк, сопоставленных с указателями на другие экземпляры EffectFactory, и двух функций; один отвечает за регистрацию экземпляров EffectFactory в карте фабрик, а другой — за функцию создания, которая может быть переопределена экземплярами EffectFactory. Моя проблема возникает, когда я компилирую библиотеку для тестирования. Я получаю сообщение об ошибке:

undefined reference to `EffectFactory::factories[abi:cxx11]'

Кажется, есть проблема с использованием C++ 11 ABI. Я снова запустил компилятор с добавлением -Wabi-tag и получил:

effect-master/effect.h:22:7: warning: 'EffectFactory' does not have the "cxx11" ABI tag that 'std::string' {aka 'std::__cxx11::basic_string<char>'} (used in the type of 'virtual Effect* EffectFactory::create(std::string)') has [-Wabi-tag]
   22 | class EffectFactory
      |       ^~~~~~~~~~~~~
effect-master/effect.h:26:19: note: 'virtual Effect* EffectFactory::create(std::string)' declared here
   26 |   virtual Effect *create(std::string config);
      |                   ^~~~~~
In file included from f:\programs\mingw\lib\gcc\mingw32\9.2.0\include\c++\string:55,
                 from f:\programs\mingw\lib\gcc\mingw32\9.2.0\include\c++\bits\locale_classes.h:40,
                 from f:\programs\mingw\lib\gcc\mingw32\9.2.0\include\c++\bits\ios_base.h:41,
                 from f:\programs\mingw\lib\gcc\mingw32\9.2.0\include\c++\ios:42,
                 from f:\programs\mingw\lib\gcc\mingw32\9.2.0\include\c++\ostream:38,
                 from f:\programs\mingw\lib\gcc\mingw32\9.2.0\include\c++\iostream:39,
                 from effect-master/effect.h:4,
                 from effect-master/effect.cpp:1:
f:\programs\mingw\lib\gcc\mingw32\9.2.0\include\c++\bits\basic_string.h:77:11: note: 'std::string' {aka 'std::__cxx11::basic_string<char>'} declared here
   77 |     class basic_string
      |           ^~~~~~~~~~~~
In file included from effect-master/effect.cpp:1:
effect-master/effect.h:29:49: warning: 'EffectFactory::factories' inherits the "cxx11" ABI tag that 'std::map<std::__cxx11::basic_string<char>, EffectFactory*>' (used in its type) has [-Wabi-tag]
   29 |   static std::map<std::string, EffectFactory *> factories;
      |                                                 ^~~~~~~~~
In file included from f:\programs\mingw\lib\gcc\mingw32\9.2.0\include\c++\map:61,
                 from effect-master/effect.h:6,
                 from effect-master/effect.cpp:1:
f:\programs\mingw\lib\gcc\mingw32\9.2.0\include\c++\bits\stl_map.h:100:11: note: 'std::map<std::__cxx11::basic_string<char>, EffectFactory*>' declared here
  100 |     class map
      |           ^~~

Из того, что я могу понять, похоже, существует какая-то несовместимость между EffectFactory и std::string, и std::map. Я потратил некоторое время на гугление и нашел решение с использованием -D_GLIBCXX_USE_CXX11_ABI=0, но это не помогло. Я также нашел этот вопрос, но не нашел особого смысла об этом и не знаю, относится ли это к моей ситуации. Любой, кто может помочь мне понять и, возможно, решить эту проблему?

Для справки я использую компилятор MinGW g++.

эффект.ч

#ifndef EFFECT_H
#define EFFECT_H

#include <iostream>
#include <string>
#include <map>
#include <regex>

class EffectFactory;

class Effect
{
public:
  bool enabled = true;
  void toggleEnabled();
  virtual void triggerAction();
  virtual int eval(int input_signal);

protected:
  int output_signal;
};
class EffectFactory
{
public:
  static void registerType(const std::string &name, EffectFactory *factory);
  virtual Effect *create(std::string config);

private:
  static std::map<std::string, EffectFactory *> factories;
};

#endif

эффект.cpp

#include "effect.h"

void Effect::toggleEnabled()
{
  enabled = !enabled;
};
void Effect::triggerAction()
{
  std::cout << "The base triggerAction was triggered\n";
};
int Effect::eval(int input_signal)
{
  std::cout << "The base eval was triggered\n";
  return input_signal;
};

Effect *EffectFactory::create(std::string config)
{
  std::smatch name_match;
  std::regex name_regex("^\\S+(?:\\n?)");
  std::regex replace_regex("^\\S+\\n?|^ {2}");
  std::regex_search(config, name_match, name_regex);
  config = std::regex_replace(config, replace_regex, "");
  return factories[name_match.str()]->create(config);
};
void EffectFactory::registerType(const std::string &name, EffectFactory *factory)
{
  factories[name] = factory;
};

person Laika    schedule 14.03.2021    source источник