C++ 在封闭源代码库中使用STL

C++ 在封闭源代码库中使用STL,c++,stl,C++,Stl,在库中使用一个符合标准的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 #

在库中使用一个符合标准的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
}
//library.h
#include//假设它使用minGW STL
void Foo(std::string和stru_mingw);
//library.cpp
voidfoo(std::string&str_mingw){/*做点什么*/}
//application.cpp
#包括“library.h”
#include//假设它使用VStudio STL
空条()
{
std::string str_vstudio;
Foo(str_vstudio);
//.lib或.dll中的Foo()使用minGW中的字符串,
//但这里使用了VStudio中的字符串
}

在我看来,糟糕的事情会发生,特别是如果使用的不是简单的字符串,而是更复杂的东西,比如tr2::thread。但是如果是这样,我如何在一个编译器中编译一个库,并让库用户为他们的项目自由选择他们喜欢的编译器?

这取决于库、平台以及编译和链接它的方式。通常(尤其是在Windows上)库是以DLL的形式分发的,对于边界上可以有什么以及如何编译每个库都有非常具体的规则

例如,Boost为以下各项构建DLL:

  • 单线程或多线程
  • 调试或发布
  • 静态(lib)或动态(DLL)
  • 对于每个不同的编译器和版本
有关排列,请参见

所以是的,这是一个大问题

在库中使用一个符合标准的STL,在使用该库的项目中使用另一个STL是否安全

没有

STL的一些可重用部分被放入一个共享库中。如果程序交替使用这两个类,则无法保证类的内部结构在不同的STL中匹配,从而导致偶发性崩溃


还请注意,来自不同供应商的STL可能具有不同的内部名称空间和类组织。这会导致公共符号
std::basic_string
可能具有不同的内部名称,并且会以不同的方式损坏,从而使
void Foo(std::string&stru mingw)
无效Foo(std::string和str_vstudio)从链接器的角度来看,有两个不同的函数。

如果-按库-你指的是动态库-简单的答案是:否,复杂的答案是:否

C++和动态库是一个非常脆弱的前景。任何微小的更改都需要重建所有模块,每个库使用的运行时必须是完全相同的库实例

即使您设法跨dll边界获取了一个std::string,但std::string的外部接口是固定的,任何实现差异都会使数据看起来损坏

只有在运行时可能不同的情况下,在动态库之间传递简单的POD结构和本机数据类型才是安全的——即使如此,也必须注意正确管理对象生命周期——分配库必须是取消分配库

如果你指的是静态库——这没有多大意义——我不认为MinGW制作的libs与MSDev兼容,MSDev libs与MinGW不兼容。即使lib文件格式名义上是兼容的——假设不同的名称损坏不会导致成功的损坏:将使用最终链接环境的STL库

使用一种标准是否安全 库中的兼容STL,以及 项目中的另一个 图书馆<代码>无效Foo(std::string和stru_mingw)<代码>Foo(str_vstudio)

不,它甚至与动态库没有太多关系。即使您设法以某种方式将MS std::string和MinGW std::string链接到同一个可执行文件中,它仍然会中断。您的程序中有两个单独(可能不同)的std::string定义,如果将它们混合在一起,您将处于未定义的行为区域


但是,请注意,如果在接口中未使用std::string,则它将起作用。也就是说,只要在接口级别使用const char*(作为示例),并且不将任何字符串放入WinSxS中,就可以有一个库在内部使用MinGW字符串,另一个库在内部使用VC字符串。

。糟糕!Windows/MinWG n00b问:为什么不能将VS STL与MinGW一起使用?标题真的应该是“在一个项目中使用多个标准库”吗?封闭源代码似乎与所问的实际问题无关。@Mark B我指定了“封闭源代码”,因为客户可以使用他们喜欢的任何STL来编译开放源代码库,所以肯定没有问题。谢谢大家的回答。我现在明白了。