Безопасно ли использовать один стандартный совместимый 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. Но если так, Как я могу скомпилировать библиотеку в одном компиляторе и позволить пользователям библиотеки свободно выбирать предпочитаемый им компилятор для своих проектов?
Безопасно ли использовать один стандартный STL в библиотеке, а другой — в проекте, использующем эту библиотеку?
Нет.
Некоторые части STL для повторного использования помещены в разделяемую библиотеку. Невозможно гарантировать, что внутренняя структура классов будет совпадать в разных STL, что приведет к спорадическим сбоям, если оба используются программой взаимозаменяемо.
Также обратите внимание, что STL от разных поставщиков могут иметь различную организацию внутренних пространств имен и классов. Это приводит к тому, что общедоступный символ std::basic_string
может иметь разные внутренние имена и по-разному искажаться, делая void Foo(std::string& str_mingw);
и void Foo(std::string& str_vstudio);
с точки зрения компоновщика две разные функции.
Безопасно ли использовать один стандарт совместимый STL в библиотеке и другой в проекте, который использует это библиотека? ...
void Foo(std::string& str_mingw);
...Foo(str_vstudio);
Нет. Это даже не имеет особого отношения к динамическим библиотекам. Даже если вам удастся каким-то образом связать как MS std::string, так и MinGW std::string в один и тот же исполняемый файл, он все равно сломается. У вас есть два отдельных (вероятно, разных) определения std::string в вашей программе, и если вы смешаете их, вы окажетесь в стране неопределенного поведения.
Обратите внимание, однако, что это будет работать, если ваш std::string не используется в интерфейсе. То есть: у вас может быть одна библиотека, которая использует строки MinGW внутри, и другая библиотека, которая использует строки VC внутри, если вы используете const char* (в качестве примера) на уровне интерфейса.