Коротко говоря, у меня есть две библиотеки, которые внутри используют std::regex. Один построен с использованием CXX11 ABI, а другой — нет. Когда эти две библиотеки связаны вместе в один исполняемый файл, происходит сбой при запуске (до ввода основного).
Библиотеки не связаны между собой и не предоставляют интерфейсы, в которых упоминаются какие-либо std. :: типы. Я думал, что такие библиотеки должны быть защищены от двойных проблем ABI. Судя по всему, нет!
Проблему можно легко воспроизвести следующим образом:
Код: Выделить всё
// file.cc
#include
static std::regex foo("(a|b)");
// main.cc
int main() {}
// build.sh
g++ -o new.o -c file.cc
g++ -o old.o -c file.cc -D_GLIBCXX_USE_CXX11_ABI=0
g++ -o main main.cc new.o old.o
./main
Код: Выделить всё
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
Aborted (core dumped)
Очевидно (это то, что вытекает из моего короткого расследования), компилятор регулярных выражений libstdc++ имеет какие-то внутренние статические данные, в которых хранятся std::string, и когда два ABI-несовместимых фрагмента кода пытаются использовать эти данные, возникают противоречивые представления о расположении объектов std::string.
Поэтому мои вопросы:< /p>
- Есть ли обходной путь для этой проблемы?
- Следует ли это считать ошибкой в libstdc++?
Подробнее здесь: https://stackoverflow.com/questions/513 ... d-dual-abi