在没有 CRT、memcpy 和 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
  • 打开文件映射
  • MapViewOfFile
  • 创建文件映射

我的问题:

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

原文由 Knox 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
1 个回答

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

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

解决这些问题的标准方法(尽管微软 极其 看不起)是链接到 MSVCRT.dll 的系统副本,它 以某种形式 随所有版本的 Windows 一起提供。只要您使用标准的 C 函数,如 memset 您完全可以忽略 Microsoft 刺眼的不赞成并链接到您的心脏内容,但不要尝试将它用于更复杂的函数和 API阴极射线管。

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


更新:我们现在发布预先创建的 mscvrt.lib 文件用于静态链接到 x86 和 x64 平台的 CRT(风险自负!): https ://github.com/neosmart/msvcrt.lib

原文由 Mahmoud Al-Qudsi 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题