我正在尝试尽可能小地构建一个应用程序,并且这样做是为了避免使用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