2010-10-10 70 views
1

我正在编写一个可以在Linux(gcc 4.3)和Windows(MS VS08 Express)下编译的C++应用程序。在C++中使用调试/发行版本DLL

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

Linux的,它们被编译为共享库,而 上的Windows,有两个版本的“调试”和“释放”。

我知道调试版本为调试额外的支持(就像使用在Linux GCC -ggdb选项,对吧?)

但我发现,如果我的应用是在调试版本,该库还必须在版本的调试中,否则应用程序将崩溃。

为什么会有这样的限制?看来在linux世界中没有这样的限制

非常感谢!

回答

5

您 程序的调试配置编译完整的符号 调试信息和无优化。 优化使调试复杂化, ,因为 源代码和生成的指令 之间的关系更复杂。

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

Debug vs Release

也可以调试你的发布版本的编译器标志。

Debugging Release Builds

  • 堆布局 - 保护字节,以防止覆盖
  • 编译 - 围绕三分球,以防止赛格故障
  • 优化缓冲器 - - 内联函数
  • 删除断言/调试信息
  • 指针支持

Common Problems When Creating Release Builds

详细说明Martin Tornwall。各种库链接在调试时或松开

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

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

CRT Libraries

+0

非常感谢您的帮助! – user1492900 2010-10-11 01:25:19

4

最有可能的,T他的Release和Debug版本与不同版本的C++ Runtime库链接。通常情况下,Debug构建与“Multithreaded Debug DLL”运行时链接,而Release构建通常会链接到“Multithreaded DLL”。加载运行时库与应用程序库不匹配的DLL通常会导致神秘的崩溃。

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

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

+0

非常感谢! – user1492900 2010-10-11 01:38:06

2

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

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

如果您不仔细控制编译设置,传递不同库中的对象或指针始终是个问题。当你这样做时,混合和匹配CRT版本和风味会让你陷入麻烦。这通常会产生链接器的警告,不知道你做了什么不看它。如果代码存在于DLL中,将不会有一个。

+0

非常感谢! – user1492900 2010-10-11 01:43:01

相关问题