Использование STL в библиотеке с закрытым исходным кодом

Безопасно ли использовать один стандартный совместимый STL в библиотеке, а другой - в проекте, который использует это библиотека? Например:

//library.h

#include <string>  //let's say here it uses minGW STL

void Foo(std::string& str_mingw);

//library.cpp
void Foo(std::string& str_mingw) { /*do something*/ }



//application.cpp

#include "library.h"
#include <string>  //let's say here it uses VStudio STL

void Bar()
{
  std::string str_vstudio;
  Foo(str_vstudio);
  //Foo() inside the .lib or .dll uses string from minGW,
  //but here a string from VStudio is used
}

Мне кажется, что произойдут плохие вещи, особенно если используется не простая строка, а что-то более сложное, например tr2 :: thread. Но если так, Как я могу скомпилировать библиотеку в одном компиляторе и позволить пользователям библиотеки свободно выбирать предпочитаемый им компилятор для своих проектов?

8
задан twf 31 August 2010 в 13:38
поделиться

2 ответа

Безопасно ли использовать один стандартный STL в библиотеке, а другой — в проекте, использующем эту библиотеку?

Нет.

Некоторые части STL для повторного использования помещены в разделяемую библиотеку. Невозможно гарантировать, что внутренняя структура классов будет совпадать в разных STL, что приведет к спорадическим сбоям, если оба используются программой взаимозаменяемо.

Также обратите внимание, что STL от разных поставщиков могут иметь различную организацию внутренних пространств имен и классов. Это приводит к тому, что общедоступный символ std::basic_string может иметь разные внутренние имена и по-разному искажаться, делая void Foo(std::string& str_mingw); и void Foo(std::string& str_vstudio); с точки зрения компоновщика две разные функции.

6
ответ дан 5 December 2019 в 10:00
поделиться

Безопасно ли использовать один стандарт совместимый STL в библиотеке и другой в проекте, который использует это библиотека? ... void Foo(std::string& str_mingw); ... Foo(str_vstudio);

Нет. Это даже не имеет особого отношения к динамическим библиотекам. Даже если вам удастся каким-то образом связать как MS std::string, так и MinGW std::string в один и тот же исполняемый файл, он все равно сломается. У вас есть два отдельных (вероятно, разных) определения std::string в вашей программе, и если вы смешаете их, вы окажетесь в стране неопределенного поведения.

Обратите внимание, однако, что это будет работать, если ваш std::string не используется в интерфейсе. То есть: у вас может быть одна библиотека, которая использует строки MinGW внутри, и другая библиотека, которая использует строки VC внутри, если вы используете const char* (в качестве примера) на уровне интерфейса.

1
ответ дан 5 December 2019 в 10:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: