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

时间:2009-07-26 14:54:14

标签: c++ windows visual-studio dll stl

好的.....我已经完成了所有相关问题的阅读,以及一些MSDN文章,以及大约一天的谷歌搜索。

这个问题的当前“最新状态”回答是什么:

我正在使用VS 2008,C ++非托管代码。我有一个包含相当多DLL和很多EXE的解决方案文件。只要我完全控制构建环境,使得所有的部件和部件都使用相同的标志构建,并使用相同的运行时库,并且没有人拥有静态链接的CRT库,我可以传递STL对象吗? / p>

看起来这应该没问题,但根据您阅读的文章,会有很多恐惧,不确定和怀疑。

我知道在幕后产生静态数据的模板有各种各样的问题(每个dll都会得到自己的副本,导致心痛),但是常规的旧STL呢?

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:1)

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

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

#定义

_WIN32_WINNT
STRICT
_WIN32_IE
NDEBUG
_DEBUG
_SECURE_SCL

编译器选项

DebugInformationFormat
WholeProgramOptimization
RuntimeLibrary

答案 2 :(得分:0)

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

我们遇到麻烦的唯一区域是一个dll分配内存而另一个dll尝试删除它。据报道这只是坏事,但我不确定原因。但是,它似乎只是Debug版本(报告的位置)的问题,但仍然适用于发布版本。说过,无论我遇到过哪种情况,我都会解决它。

如果我正在编写第三方库,我会考虑在api中使用stl参数。以前(VC6)我们不得不使用OCI(Oracles C api)而不是OCCI(Oracles C ++ api),因为它只适用于Microsoft STL实现,而我们使用的是stlport。当然,如果您使客户端使用自己的stl实现来构建库,则这不是问题。