在没有CRT,memcpy和memset内部函数的情况下构建时链接错误

时间:2014-01-27 03:26:22

标签: c++ memcpy intrinsics crt memset

我尝试尽可能小地构建应用程序,并且这样做是为了避免使用Win API调用而不是标准的C / C ++调用来避免使用CRT。不幸的是,我仍然遇到一个链接器错误:

Error   2   error LNK2001: unresolved external symbol _memcpy

我没有在我的代码中的任何地方调用memcpy,所以我假设其中一个Windows函数正在调用它。打开内部函数会给出一个未解析的符号_memset,我也不会使用它。根据我的理解,memcpy和memset都应包含在启用的内部函数中。 由于我的代码太长而无法发布,因此以下是我程序中的Win API调用:

  • lstrcpy
  • wsprintf
  • CopyMemory - 当我发表评论时,错误会切换到_memset
  • OpenFileMapping
  • MapViewOfFile
  • 的CreateFileMapping

我的问题:

  • 如果我/ Oi声明了,为什么不包含内在函数?
  • 我需要自己声明memset和memcpy吗?
    • 如果是这样,如果没有Visual Studio抱怨内部函数的重新定义,我该怎么办呢?

3 个答案:

答案 0 :(得分:4)

/Oi没有记录为必要时尽可能插入所有内在函数,而只是让编译器可以选择这样做。我无法弄清楚MSVC用什么逻辑来达到最终结论,但是有些因素包括项目模式(与DEBUG相比,它更可能在RELEASE中注入内在函数)和函数的长度。 / p>

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

解决这些问题的标准方法(虽然非常由Microsoft查看)是链接到MSVCRT.dll的系统副本,MSVCRT.dll以某种形式或其他形式发送 适用于所有版本的Windows。只要你使用像memset这样的标准C函数,你就可以完全忽略微软不赞成的强烈抨击并链接到你内心的内容,但是不要试图将它用于CRT提供的更复杂的功能和API

要链接msvcrt.dll,您需要使用LoadLibrary和co或者使用预先生成的msvcrt.lib(Microsoft故意不提供)来告诉MSVC哪些功能可用于系统MSCRT.dll

答案 1 :(得分:1)

memset()来自ZeroMemory()

在点击这个时,我只输入了" C编程语言"中的memcpy,memmove,memset的规范定义。

答案 2 :(得分:-4)

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