gpt4 book ai didi

c++ - 在没有 CRT、memcpy 和 memset 内部函数的情况下构建时出现链接错误

转载 作者:可可西里 更新时间:2023-11-01 18:37:48 41 4
gpt4 key购买 nike

我试图构建一个尽可能小的应用程序,在这样做的过程中,我试图通过使用 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 提示内部函数的重新定义?

最佳答案

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

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

解决这些问题的标准方法(尽管 极度被 Microsoft 轻视)是链接到 MSVCRT.dll 的系统拷贝,它以某种或其他形式发布 适用于所有版本的 Windows。只要你使用标准的 C 函数,比如 memset,你就可以完全无视微软尖锐的反对目光并链接到你的内心,但不要尝试将它用于更复杂的函数和提供的 API由 CRT。

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


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

关于c++ - 在没有 CRT、memcpy 和 memset 内部函数的情况下构建时出现链接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21372539/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com