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

 益清613 发布于 2023-01-31 11:27

我正在尝试尽可能小地构建一个应用程序,并且这样做是为了避免使用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抱怨重新定义内部函数,我该怎么办呢?

Mahmoud Al-Q.. 6

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

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

解决这些问题(虽然工作的标准方法非常微软白眼)是打击了MSVCRT.dll的系统复制,链接,船舶以某种形式或其他与所有版本的Windows。只要您使用的是标准C函数memset,就可以完全忽略Microsoft令人讨厌的强烈反对,并链接到您内心的内容,但不要尝试将其用于CRT提供的更复杂的函数和API。

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


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

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有