[英]Linking error when building without CRT, memcpy and memset intrinsic functions
我正在尝试尽可能小地构建一个应用程序,并且这样做我试图通过使用Win API调用而不是标准的C / C ++调用来避免使用CRT。 不幸的是,我仍然遇到一个链接器错误:
Error 2 error LNK2001: unresolved external symbol _memcpy
我不会在我的代码中的任何地方调用memcpy,所以我假设其中一个Windows函数正在调用它。 打开内部函数会给出一个未解析的符号_memset,我也没有使用它。 根据我的理解,memcpy和memset都应包含在启用的内部函数中。 由于我的代码太长而无法发布,以下是我的程序中的Win API调用:
我的问题:
/Oi
没有记录为必要时尽可能插入所有内在函数,而只是让编译器可以选择这样做。 我无法弄清楚MSVC用什么逻辑来达到最终结论,但是一些因素包括项目模式(与DEBUG相比,它更可能在RELEASE中注入内在函数)和函数的长度。
最近版本的Visual Studio确实将MSVCRT依赖项集成到编译器中,生成不依赖于标准C运行时的代码变得越来越困难。
解决这些问题的标准方法(尽管微软非常鄙视)是链接MSVCRT.dll的系统副本,MSVCRT.dll 以某种形式或其他版本的Windows发布。 只要您使用像memset
这样的标准C函数,您就可以完全忽略微软的反对意见并将其链接到您内心的内容,但不要尝试将其用于CRT提供的更复杂的功能和API。
若要链接到msvcrt.dll,您需要使用LoadLibrary
和co或者使用预先生成的msvcrt.lib(Microsoft故意不提供)来告诉MSVC系统MSCRT.dll中有哪些功能可用
更新:我们现在发布mscvrt.lib
文件,用于静态链接CRT(风险自负!),适用于x86和x64平台: https : //github.com/neosmart/msvcrt.lib
memset()
来自ZeroMemory()
在点击这个时,我只输入了“C编程语言”中memcpy,memmove,memset的规范定义。
你无法避免链接到CRT。 但是,要减小EXE的大小,您可以静态链接到CRT。 链接器将删除所有不需要的CRT代码,因此您的应用程序将尽可能小。 并且不会有任何链接器错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.