繁体   English   中英

在C ++中使用调试/发行版DLL

[英]Using debug/release versions DLL in C++

我正在编写一个可以在Linux(gcc 4.3)和Windows(MS VS08 Express)下编译的C ++应用程序。

我的应用程序使用第三方库,

Linux上 ,它们被编译为共享库,而在Windows上 ,有两个版本“ Debug”和“ Release”。

我知道调试版本为调试提供了额外的支持(就像在Linux gcc中使用-ggdb选项一样,对吗?)

但是我发现,如果我的应用程序处于调试版本,则这些库也必须处于调试版本,否则应用程序将崩溃。

为什么会有这样的限制? 似乎在Linux世界中没有这样的限制

非常感谢你!

程序的Debug配置是使用完整的符号调试信息编译的,并且没有优化。 优化使调试复杂化,因为源代码和生成的指令之间的关系更加复杂。

程序的Release配置不包含符号调试信息,并且已完全优化。 可以根据所使用的编译器选项在PDB文件(C ++)中生成调试信息。 如果以后需要调试发行版,则创建PDB文件可能非常有用。

调试与发布

也可以使用编译器标志调试发行版。

调试发行版

  • 堆布局-保护字节以防止覆盖
  • 编译-删除断言/调试信息
  • 指针支持-指针周围的缓冲区可防止seg错误
  • 优化-内联函数

创建发行版本时的常见问题

详细阐述马丁·托恩沃尔。 在Debug或Release中链接的各种库

  • LIBCPMT.LIB,多线程,静态链接,/ MT,_MT

  • LIBCPMTD.LIB,多线程,静态链接,/ MTd,_DEBUG,_MT

CRT库

最有可能的是,发行版和调试版链接到C ++运行时库的不同版本。 通常,调试版本会链接到“多线程调试DLL”运行时,而发布版本通常会链接到“多线程DLL”。 加载运行时库与应用程序库不匹配的DLL通常会导致神秘的崩溃。

您可以尝试验证所有DLL是根据与应用程序相同的运行时库构建的,而不管哪个配置(调试或发布)处于活动状态。 这是否令人满意,完全是另一个问题。

选择要链接到哪个运行时库的功能使应用程序开发人员可以根据应用程序的需求选择最佳功能集。 例如,如果单线程应用程序与考虑了线程安全性的运行时库链接,则可能会由于不必要的线程同步而导致性能下降。 同样,将多线程应用程序链接到单线程运行时的后果可能是灾难性的。

尽管我从来没有故意链接使用不同的编译器设置构建的库,但是这样做没有多大意义,但我只知道Dinkumware实现(一个MSFT使用的)中的STL类会导致此问题。

它们支持一项称为“迭代器调试”的功能,该功能在调试配置中默认情况下处于启用状态。 这会将成员添加到类中以帮助诊断代码。 使它们更大。 当您在使用一个设置编译的代码块中创建对象并将其传递给使用相反设置编译的代码时,这将变得很糟糕。 您可以通过将_HAS_ITERATOR_DEBUGGING宏设置为0来关闭此功能。这是一个很大的损失,该功能非常适合诊断使用STL类的错误。

如果您不仔细控制编译设置,则在不同库之间传递对象或指针总是一个问题。 混合并匹配CRT版本和风味会给您带来麻烦。 通常,这会从链接器生成警告,不确定您没有看到什么。 如果代码驻留在DLL中,将不会存在。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM