在没有CRT,Memcpy和Memset固有函数的情况下链接误差



我正在尝试构建尽可能微小的应用程序,在此过程中,我试图避免使用win api呼叫而不是标准C/C 调用来避免使用CRT。不幸的是,我仍会收到一个链接器错误:

Error   2   error LNK2001: unresolved external symbol _memcpy

我在代码中的任何地方都不称呼memcpy,因此我认为Windows功能之一正在调用。打开内在函数给出了未解决的符号_memset,我也不使用它。从我的理解来看,启用了内在功能,都应包括内存和memset。由于我的代码太长了,因此以下是我程序中的win api呼叫:

  • lstrcpy
  • wsprintf
  • copymemory-当我评论此评论时,错误切换到_memset
  • OpenFileMapping
  • mapviewoffile
  • CreateFileMapping

我的问题:

  • 如果我声明/oi,为什么不包括固有函数?
  • 我需要自己声明Memset和memcpy吗?
    • 如果是这样,我该如何在没有视觉工作室抱怨内在函数的重新定义的情况下这样做?

/Oi并未记录为一定要在可能的情况下插入所有内在物质,而仅使编译器可以选择这样做。我无法弄清楚MSVC用来得出最终结论的逻辑,但是某些因素包括项目模式(与调试相比,更有可能在发行中注入内在物质)和功能的长度。<<<<<<<<<<<<<</p>

最新版本的Visual Studio确实将MSVCRT依赖项集成到编译器中,并且生成不取决于标准C运行时的代码变得越来越困难。

围绕这些问题工作的标准方式(尽管Microsoft被Microsoft低估了)是针对MSVCRT.dll的系统副本链接,该副本以某种形式或其他形式heps 带有所有版本的Windows。只要您使用标准C函数,例如memset,您就可以非常忽略Microsoft的不赞成的刺眼并将其链接到您的心脏内容,但不要尝试将其用于CRT提供的更复杂的功能和API。

要针对MSVCRT.dll链接,您需要使用LoadLibrary并使用CO或使用预先生成的MSVCRT.LIB(Microsoft有意地提供一个)才能告诉MSVC MSVC System Mscrt.dll中有哪些功能可用


更新:现在,我们发布X86和X64平台与CRT静态链接的静态链接的mscvrt.lib文件:https://github.com/neosmart/neosmart/msvcrt.libt.lib

<>

memset()来自 ZeroMemory()

在击中此事时,我刚刚输入了" C编程语言"中的memcpy,memmove,memset的规范定义。

我面临类似的问题,将vcruntime.lib添加到链接器选项中,然后重建对我有帮助。

您无法避免链接到CRT。但是,为了减小EXE的大小,您可以静态链接到CRT。链接器将剥离所有不需要的CRT代码,因此您的应用程序将尽可能小。而且不会有任何链接器错误。