问题的动机:生成 64 位和 32 位代码需要两个单独的完整程序编译,并且在使用 Visual Studio(如下详述)时,发布和调试版本不兼容,因此似乎需要另外两个完整程序编译(使总数达到四个)。我想坚持使用两个完整的程序编译,但我很困惑。
调试时我只关心:全局状态、堆栈帧以及导致崩溃的代码的行号/文件。另外,我不关心来自同行评审的高度稳定的开源库的调试信息;因此,我不需要这些库的调试信息,并且该库的发布版本应该足够了。
证据:我知道,在 VS 中,如果您编译应用程序的调试版本并将其与 Google Protocol Buffers 的发布版本链接,则生成的代码将由于混合发布/调试类型的副作用而失败。
我想知道这是否是使用 Visual Studio 的副作用,并且某些编译器开关可以做到这一点。
其次检查开源项目的构建脚本/过程,似乎可以将调试模式生成的代码与发布生成的代码混合(例如mumble)。我想这与 release 和 ReleaseWithDebugInfo (从 cmake 借用的术语,但这显然可以在 Visual Studio 中表达)之间的区别有关。ReleaseWithDebugInfo 毕竟是二进制的优化版本,还生成了调试信息,因此适合发布。
问题:
- 有人可以解释或提供参考,什么开关使代码不兼容。
- Visual Studio 中的 ReleaseWithDebugInfo 编译风格是否足以用于调试和发布用例(根据我的标准,如上所述)?--ie,编译器在调试模式下生成的东西是矫枉过正还是多余?
- 在 ReleaseWithDebugInfo 模式下(对于我的应用程序)我可以在发布模式下编译外部依赖项(没有调试信息)并且没有任何未定义的行为吗?