3

我有一个 Visual Studio 2012 C++ 项目。我最近卸载了它并安装了 Visual Studio 2015 并升级了项目。当我构建项目时,出现如下所示的错误:

函数中引用的错误 LNK2019 未解析的外部符号 _memcmp

此外,我的代码 memcmp 功能中没有使用过任何地方。

我使用了链接器详细函数,可以在输出文件中看到以下内容:

找到_memcmp

在 MyC++Project.obj 中引用

在 libcpmtd.lib(xstrcoll.obj) 中引用

加载 libvcruntimed.lib(__memcmp_.obj)

这里有两个问题

1.即使我没有在我的代码中使用 memcmp,为什么我会收到链接器错误?

2.为什么memcmp被加载为__memcmp_.obj

我的项目中也有以下设置:

1.C++-->代码生成-->运行库设置为/MTd

2.Linker-->Ignore All default library设置为nothing

我已经尝试了所有的项目设置,但一切都是徒劳的。

我只有这个我没有使用过的 memcmp 函数有问题。

我使用过 mamcpy 和 memset 并且没有这些问题

4

3 回答 3

9

将 vcruntime.lib 或其他适当版本的CRT 库显式添加到链接器参数(附加依赖项)。

当您显式使用 memcmp 时,它可能会作为内部函数处理并编译为内联函数。

于 2016-03-23T12:30:37.220 回答
4

尝试添加vcruntime.lib和添加ucrt.lib到您的其他依赖项。===> 属性-> 链接器-> 输入-> 附加依赖项

样本路径'vcruntime.lib': "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib\vcruntime.lib"

样本路径'ucrt.lib' : "C:\Program Files (x86)\Windows Kits\10\Lib\10.0.16299.0\ucrt\x86\ucrt.lib"

我的环境:VS2017 (v141)

于 2017-11-07T01:36:08.623 回答
0

我在nmake使用 Visual Studio 2015 的旧版 Visual C++ 6.0 文件时遇到了同样的问题。

这篇博客文章介绍了通用 CRT,描述了 Visual Studio 2015 运行时如何被拆分为多个库。运行时现在“将 CRT 分为两个逻辑部分:VCRuntime,其中包含进程启动和异常处理等所需的编译器支持功能,以及包含 CRT 所有纯库部分的“稳定”部分”以便于更新。

只要您不使用该/nodefaultlib选项链接,当您链接项目时,将找到所有正确的库文件。如果您使用该/nodefaultlib选项链接,则在链接时需要链接几个额外的库。例如,虽然您以前可能只是msvcrt.lib为了使用 CRT DLL 而进行了链接,但现在您还需要链接vcruntime.libucrt.lib. 下表显示了您需要为库的每个“风格”链接哪些库:

Release DLLs   (/MD ): msvcrt.lib   vcruntime.lib      ucrt.lib
Debug DLLs     (/MDd): msvcrtd.lib  vcruntimed.lib     ucrtd.lib
Release Static (/MT ): libcmt.lib   libvcruntime.lib   libucrt.lib
Debug Static   (/MTd): libcmtd.lib  libvcruntimed.lib  libucrtd.lib

另请参阅 Microsoft 文档C 运行时 (CRT) 和 C++ 标准库 (STL) .lib 文件,其中描述了有关库的详细信息。

另请参阅Microsoft C/C++ 更改历史 2003 - 2015

于 2021-10-08T01:12:33.387 回答