DLL和STL和静态数据(哦我的!)

好的…..我已经完成了有关相关问题的阅读,还有一些MSDN文章,以及大约一天的Googlesearch。

什么是目前的“最先进的”这个问题的答案:

我正在使用VS 2008,C ++非托pipe代码。 我有一个解决scheme文件与不lessDLL和不lessEXE。 只要我完全控制了构build环境,使得所有的部分和部分都使用相同的标志,并且使用相同的运行时库,并且没有人拥有静态链接的CRT库,那么我可以传递STL对象吗?

看来这应该是好的,但是根据你阅读的是哪篇文章,恐惧,不确定性和怀疑是很多的。

我知道模板在后台产生静态数据有各种各样的问题(每个DLL都会得到自己的副本,导致心痛),但是普通的旧STL又如何呢?

我们成功地在由几十个DLL组成的应用程序中传递了STL对象。 为了确保它能正常工作,我们在每个构建中运行的自动化测试之一是验证所有项目的设置。 如果您添加一个新项目并对其进行错误配置,或者中断现有项目的配置,则构建失败。

我们检查的设置如下。 请注意,并非所有这些都会导致问题,但我们检查它们的一致性。

#定义

_WIN32_WINNT STRICT _WIN32_IE NDEBUG _DEBUG _SECURE_SCL 

编译器选项

 DebugInformationFormat WholeProgramOptimization RuntimeLibrary 

只要他们使用完全相同版本的运行时DLL,STL应该没有问题。 但是一旦你碰巧有几个,他们会使用不同的堆 – 导致无尽的麻烦。

我们在应用程序中使用stl集合,并将它们传递给不同dll(通常作为引用)的方法。 这不会造成任何麻烦。

我们唯一遇到麻烦的地方是一个dll分配内存,另一个dll尝试删除它。 这只是报告不好,但我不知道为什么。 然而,它似乎只是一个调试版本(据报道)的问题,但仍然在发布版本上工作。 话虽如此,我遇到这个问题,我做了修复。

如果我正在写第三方库,我会考虑在API中使用stl参数。 以前(VC6),我们必须使用OCI(Oracles C api)而不是OCCI(Oracles C ++ api),因为它只能与Microsoft STL实现一起工作,而且我们正在使用stlport。 当然,如果你让你的客户用自己的stl实现构建库,这不是一个问题。