我正在编写一个可以在Linux(gcc 4.3)和Windows(MS VS08 Express)下编译的C ++应用程序。
我的应用程序使用第三方库
在 Linux 上,它们被编译为共享库,而 在 Windows 上,有两个版本“Debug”和“Release”。
我知道 debug 版本为调试提供了额外的支持(就像在linux gcc中使用 -ggdb 选项一样,对吗?)
但我发现如果我的应用程序是 debug 版本,那么库也必须是 debug 版本,否则应用程序将崩溃。
为什么会有这样的限制?似乎Linux世界中没有这样的限制
非常感谢!
答案 0 :(得分:5)
你的Debug配置 程序是用完整的符号编译的 调试信息,没有优化。 优化使调试变得复杂, 因为之间的关系 源代码和生成的指令 更复杂。
您的发布配置 程序不包含符号调试 信息并完全优化。 可以生成调试信息 PDB文件(C ++)取决于 使用的编译器选项创建PDB 如果你以后,文件可能非常有用 需要调试你的发布版本。
也可以使用编译器标志调试发布版本。
Common Problems When Creating Release Builds
详细阐述Martin Tornwall。在Debug或Release
中链接的各种库
LIBCPMT.LIB,多线程,静态链接,/ MT,_MT
LIBCPMTD.LIB,多线程,静态链接,/ MTd,_DEBUG,_MT
答案 1 :(得分:5)
最有可能的是,Release和Debug版本链接到不同版本的C ++ Runtime库。通常,Debug构建链接“多线程调试DLL”运行时,而Release构建通常链接“多线程DLL”。加载其运行时库与应用程序库不匹配的DLL通常会导致神秘的崩溃。
您可以尝试验证所有DLL都是针对与应用程序相同的运行时库构建的,无论哪个配置(调试或发布)处于活动状态。这是否可取是另一个问题。
选择链接的运行时库的能力使应用程序开发人员能够根据应用程序的要求选择最佳功能集。例如,如果单线程应用程序与设计时考虑到线程安全性的运行时库链接,则可能会因不必要的线程同步而导致性能损失。同样,将多线程应用程序与单线程运行时链接起来的后果可能是灾难性的。
答案 2 :(得分:2)
虽然我从不故意链接使用不同编译器设置构建的库,但没有太多意义,我只知道Dinkumware实现中的STL类(MSFT使用的那个)导致此问题。 / p>
它们支持一个名为'iterator debugging'的功能,该功能在Debug配置中默认打开。这会将成员添加到类中以辅助诊断代码。让它们更大。当您在一个使用一个设置编译的代码块中创建对象并将其传递给使用相反设置编译的代码时,这会变得很糟糕。您可以通过将_HAS_ITERATOR_DEBUGGING宏设置为0来关闭它。这是一个重大损失,该功能非常适合诊断使用STL类的方式中的错误。
如果不仔细控制编译设置,则在不同库之间传递对象或指针总是一个问题。混合和匹配CRT版本和风味会让你遇到麻烦。这通常会从链接器生成警告,不知道您做了什么不能看到它。如果代码存在于DLL中,则不会有一个。