在C++中使用调试/发布版本的DLL

use*_*900 1 c++ visual-c++

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

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

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

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

但是我发现如果我的应用程序是在调试版本中,那么库也必须是调试版本,否则应用程序将崩溃.

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

非常感谢你!

小智 5

程序的Debug配置使用完整的符号调试信息进行编译,无需优化.优化使调试变得复杂,因为源代码和生成的指令之间的关系更复杂.

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

调试与发布

也可以使用编译器标志调试发布版本.

调试版本构建

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

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

详细阐述Martin Tornwall.在Debug或Release中链接的各种库

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

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

CRT图书馆


Mar*_*all 5

最有可能的是,Release和Debug版本链接到不同版本的C++ Runtime库.通常,Debug构建链接"多线程调试DLL"运行时,而Release构建通常链接"多线程DLL".加载其运行时库与应用程序库不匹配的DLL通常会导致神秘的崩溃.

无论哪个配置(调试或发布)处于活动状态,您都可以尝试验证所有DLL是否针对与应用程序相同的运行时库进行构建.这是否可取完全是另一个问题.

选择链接的运行时库的能力使应用程序开发人员能够根据应用程序的要求选择最佳功能集.例如,如果单线程应用程序与设计时考虑到线程安全性的运行时库链接,则可能会因不必要的线程同步而导致性能损失.同样,将多线程应用程序与单线程运行时链接起来的后果可能是灾难性的.