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

在C++中使用调试/发布版本的DLL 我正在编写一个C++应用程序,可以在Linux GCC 4.3和Windows MS VS08 Express下编译。,c++,visual-c++,C++,Visual C++,我的应用程序使用第三方库 在Linux上,它们被编译为共享库,而 在Windows上,有两个版本调试和发布 我知道调试版本为调试提供了额外的支持,就像在LinuxGCC中使用-ggdb选项一样,对吗 但我发现,如果我的应用程序处于调试版本,库也必须处于调试版本,否则应用程序将崩溃 为什么会有这样的限制?linux世界似乎没有这样的限制 多谢各位 系统的调试配置 程序是用全符号编译的 调试信息,无优化。 优化使调试复杂化, 因为 源代码和生成的指令 这个问题更复杂 您的应用程序的发布配置 程序不包

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

在Linux上,它们被编译为共享库,而 在Windows上,有两个版本调试和发布

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

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

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

多谢各位

系统的调试配置 程序是用全符号编译的 调试信息,无优化。 优化使调试复杂化, 因为 源代码和生成的指令 这个问题更复杂

您的应用程序的发布配置 程序不包含符号调试 充分优化了信息和服务。 调试信息可以在中生成 PDB文件C++依赖于 使用的编译器选项。创建PDB 如果您稍后再查看,文件可能非常有用 需要调试您的发布版本

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

堆布局-保护字节以防止覆盖 编译-删除断言/调试信息 指针支持-指针周围的缓冲区,以防止seg故障 优化-内联函数 详细介绍马丁·托恩沃尔。调试或发布时链接的各种库

LIBCPMT.LIB,多线程,静态链接,/MT,\u-MT

LIBCPMTD.LIB,多线程,静态链接,/MTd,\u DEBUG,\u MT

系统的调试配置 程序是用全符号编译的 调试信息,无优化。 优化使调试复杂化, 因为 源代码和生成的指令 这个问题更复杂

您的应用程序的发布配置 程序不包含符号调试 充分优化了信息和服务。 调试信息可以在中生成 PDB文件C++依赖于 使用的编译器选项。创建PDB 如果您稍后再查看,文件可能非常有用 需要调试您的发布版本

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

堆布局-保护字节以防止覆盖 编译-删除断言/调试信息 指针支持-指针周围的缓冲区,以防止seg故障 优化-内联函数 详细介绍马丁·托恩沃尔。调试或发布时链接的各种库

LIBCPMT.LIB,多线程,静态链接,/MT,\u-MT

LIBCPMTD.LIB,多线程,静态链接,/MTd,\u DEBUG,\u MT


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

您可以尝试验证是否所有DLL都是根据与应用程序相同的运行时库生成的,而不管哪个配置调试或版本处于活动状态。这是否可取完全是另一个问题


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

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

您可以尝试验证是否所有DLL都是根据与应用程序相同的运行时库生成的,而不管哪个配置调试或版本处于活动状态。这是否可取完全是另一个问题

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

虽然我从未有意链接使用不同编译器设置构建的库,但这样做没有多大意义,我只知道MSFT使用的纯粹软件实现中的STL类会导致此问题

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


如果不小心控制编译设置,在不同库之间传递对象或指针总是一个问题。混合和匹配CRT版本和口味会给你带来麻烦。这通常会从链接器生成一个警告,不确定您做了什么才没有看到它。如果代码存在于DLL中,则不会有任何链接。

虽然我从未有意链接使用不同编译器设置构建的库,但这样做没有多大意义,我只知道MSFT用于导致此问题的纯粹软件实现中的STL类

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

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