【问题标题】:memcmp linker error Visual Studio 2015memcmp 链接器错误 Visual Studio 2015
【发布时间】:2016-03-21 00:32:15
【问题描述】:

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

Error LNK2019 unresolved external symbol _memcmp referenced in function

此外,我的代码 memcmp 函数中的任何地方都没有使用过。

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

找到_memcmp

在 MyC++Project.obj 中引用

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

加载的 libvcruntimed.lib(__memcmp_.obj)

这里有两个问题

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

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

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

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

2.Linker-->忽略所有默认库设置为空

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

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

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

【问题讨论】:

  • 我只遇到了我没有使用过的 memcmp 函数的问题。我在我的代码中使用了 memcpy 和 memset,它们没有任何问题。
  • 详细输出显示 xstrcoll.obj referenecs _memcmp,所以这可能是您第一个问题的答案。
  • 您使用哪些第三方库?看起来像是外部 C / 名称修改问题。
  • 不使用第三方库。

标签: c++ visual-studio-2015 linker-errors memcmp


【解决方案1】:

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

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

【讨论】:

  • 显式链接到 vcruntime.lib 为我解决了这个问题。我正在将 C++ 应用程序从 VS2005 移植到 VS2015 并在编译 IDL 代理时遇到此错误。生成的代码使用使用 memcmp 的 IID_GENERIC_CHECK_IID 宏。
  • 我添加了 vcruntime.lib、ucrt.lib,确保我是 /MD 并将对 msvcrtd.lib 的调用更改为 msvcrt.lib 以供 libpng(旧版本和 libz 1.2.5)构建正确地从 windows 上包含的项目文件中。
【解决方案2】:

尝试将vcruntime.libucrt.lib 添加到您的附加依赖项中。 ===> properties->Linker->Input->Additional Dependencies

'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)

【讨论】:

    【解决方案3】:

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

    这篇博客文章Introducing the Universal 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 runtime (CRT) and C++ Standard Library (STL) .lib files,其中描述了有关库的详细信息。

    另见Microsoft C/C++ change history 2003 - 2015

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-27
      • 1970-01-01
      • 1970-01-01
      • 2013-12-27
      相关资源
      最近更新 更多