我使用 visual studio 2008 构建了我的 C++ DLL 的/mt(运行时库:多线程)和/md(运行时库:多线程 dll)版本。
链接到/md 构建的应用程序运行良好, 但是链接到/mt build 的应用程序崩溃了。
有趣的是,链接到/mt 构建的静态版本的应用程序工作正常。
使用/mt 构建 DLL 并将其用于同样使用/mt 构建的应用程序是否有意义?
我如何追踪这种崩溃的原因?
问候,
保罗
最佳答案
这取决于您的 API。如果您使用运行时库的非 DLL 版本构建可执行文件,则每个 DLL 和 EXE 都会获得运行时库静态数据的自己的拷贝。最明显的影响是您不能从一个模块(DLL 或 EXE)动态分配某些东西并期望在另一个模块中安全地释放它。还会有其他不太常见的问题,例如,如果您在一个模块中 srand
,不要指望它会影响整个应用程序对 rand
的调用。
在链接到其他用户 DLL 的可执行文件中,根据运行时库的 DLL 版本编译它们通常是最安全的。如果您使用静态库构建静态链接的可执行文件,您可能希望使用运行时库的静态版本,这可能是为了便于打包和分发,但考虑到潜在问题,我认为混合配置没有太大好处。
关于c++ -/MT 版本的二进制文件在 Visual Studio 2008 中崩溃 - 如何调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9070106/