memcmp 链接错误 Visual Studio 2015

3

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

错误:LNK2019未解决的外部符号_memcmp在函数中被引用。

此外,在我的代码中根本没有使用memcmp函数。

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

找到 _memcmp

在MyC++Project.obj中被引用。

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

已加载 libvcruntimed.lib(__memcmp_.obj)

这里有两个问题:

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

2.为什么要将memcmp作为__ memcmp_.obj加载?

此外,我的项目中还有以下设置:

1.C++ --> Code generation --> Runtime Library设置为/MTd

2.Linker --> Ignore All default libraries设置为无任何选项。

我已尝试所有项目设置,但一切都徒劳无功。

我只对这个未使用过的memcmp函数存在问题,我已经使用了mamcpy和memset并且没有出现问题。


1
可能是[为什么我无法使用Visual Studio 2015 RC命令行工具构建Vim?]的重复问题(https://dev59.com/y4rda4cB1Zd3GeqPLV7f) - Humam Helfawi
我只在使用过的memcpy和memset函数中没有任何问题,但是在memcmp函数中出现了问题。 - Roop
冗长的输出显示xstrcoll.obj引用了_memcmp,所以这可能是你第一个问题的答案。 - stijn
你正在使用哪些第三方库?看起来像是一个extern C /名称混淆问题。 - Phil Williams
不使用第三方库。 - Roop
3个回答

8

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

当您明确使用memcmp时,它可能被处理为内置函数并编译为内联函数。


2
显式链接到vcruntime.lib解决了我的问题。我正在将一个C++应用程序从VS2005移植到VS2015,在编译IDL代理时遇到了这个错误。生成的代码使用IID_GENERIC_CHECK_IID宏,该宏使用memcmp。 - Art Dumas
我添加了vcruntime.lib和ucrt.lib,确保使用/MD,并将libpng(旧版本和libz 1.2.5)的调用从msvcrtd.lib更改为msvcrt.lib,以便从包含的项目文件在Windows上正常构建。 - twobob

5
尝试将 vcruntime.libucrt.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)

0

我在使用Visual Studio 2015处理一个遗留的Visual C++ 6.0 nmake文件时遇到了同样的问题。

这篇博客文章Introducing the Universal CRT描述了Visual Studio 2015运行库如何被分成多个库。现在,运行库已经“将CRT分为两个逻辑部分:VCRuntime,其中包含编译器支持功能,例如进程启动和异常处理,以及一个“稳定”的部分,其中包含CRT的所有纯库部分”,以便更容易地进行更新。

So long as you do not link with the /nodefaultlib option, all of the correct library files will be found when you link your project. If you link with the /nodefaultlib option, you will need to link several extra libraries when you link. For example, whereas you previously might have just linked msvcrt.lib in order to use the CRT DLL, you will now also need to link vcruntime.lib and ucrt.lib. Here is a table that shows which libraries you will need to link for each “flavor” of the libraries:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接