【发布时间】:2018-03-05 11:59:24
【问题描述】:
我正在使用 VS 2017 在调试模式下构建我的应用程序。我已经在发布模式下构建了它所依赖和链接的第 3 方库。这是允许的还是报告错误的原因。
LNK2038 mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MTd_StaticDebug' in xxx.obj my-application <path-to>\libboost_filesystem-mt-s.lib(path_traits.obj) 1
This 页面状态:
运行时库 指示应用或库使用的 C++ 标准库和 C 运行时的版本。使用一个版本的 C++ 标准库或 C 运行时的代码与使用不同版本的代码不兼容。有关详细信息,请参阅 /MD、/MT、/LD(使用运行时库)。
我了解 DLL 运行时库不能与非 DLL 库混合使用。调试库和发布库也一样吗?
我在 Linux 上做同样的事情没有任何问题。
【问题讨论】:
-
是的,调试和发布库也是如此。不能混用。
-
你不能混合调试和发布,你还应该注意 Visual Studio 2017 仅与 2015 二进制兼容。所有其他版本均不兼容。这意味着它们将在标准库实现方面存在差异,并且它们将具有不同的 CRT。如果内存在一个 CRT 中分配并在另一个 CRT 中释放,则后一个问题可能并且将导致堆损坏。
-
MSFT crt 库的后向兼容性不如linux,使用的是side-by-side方式,但最近引入了ucrt,可能会改善这种情况。对于有第三方库的项目,建议要求第三方提供使用/MT构建的二进制文件,这样可以减少由于VS版本和调试/发布配置不同而导致的链接问题。
-
您不能在一个可执行文件中混合 CRT(因为链接器只会选择一个 - 调试或发布),但如果您链接不同的可执行模块,则可以使用不同的 CRT。例如。您可以使用 Debug CRT 编译您的应用程序并使用使用 Release CRT 构建的 DLL。唯一的要求是应用程序和 DLL 之间的 ABI 必须是 CRT 中立的。
标签: c++ visual-studio visual-c++-runtime