我尝试尽可能小地构建应用程序,并且这样做是为了避免使用Win API调用而不是标准的C / C ++调用来避免使用CRT。不幸的是,我仍然遇到一个链接器错误:
Error 2 error LNK2001: unresolved external symbol _memcpy
我没有在我的代码中的任何地方调用memcpy,所以我假设其中一个Windows函数正在调用它。打开内部函数会给出一个未解析的符号_memset,我也不会使用它。根据我的理解,memcpy和memset都应包含在启用的内部函数中。 由于我的代码太长而无法发布,因此以下是我程序中的Win API调用:
我的问题:
答案 0 :(得分:4)
/Oi
没有记录为必要时尽可能插入所有内在函数,而只是让编译器可以选择这样做。我无法弄清楚MSVC用什么逻辑来达到最终结论,但是有些因素包括项目模式(与DEBUG相比,它更可能在RELEASE中注入内在函数)和函数的长度。 / p>
Visual Studio的最新版本确实已将MSVCRT依赖项集成到编译器中,并且生成不依赖于标准C运行时的代码变得越来越难。
解决这些问题的标准方法(虽然非常由Microsoft查看)是链接到MSVCRT.dll的系统副本,MSVCRT.dll以某种形式或其他形式发送 适用于所有版本的Windows。只要你使用像memset
这样的标准C函数,你就可以完全忽略微软不赞成的强烈抨击并链接到你内心的内容,但是不要试图将它用于CRT提供的更复杂的功能和API
要链接msvcrt.dll,您需要使用LoadLibrary
和co或者使用预先生成的msvcrt.lib(Microsoft故意不提供)来告诉MSVC哪些功能可用于系统MSCRT.dll
答案 1 :(得分:1)
memset()
来自ZeroMemory()
在点击这个时,我只输入了" C编程语言"中的memcpy,memmove,memset的规范定义。
答案 2 :(得分:-4)
您无法避免链接到CRT。但是,要减小EXE的大小,您可以静态链接到CRT。链接器将删除所有不需要的CRT代码,因此您的应用程序将尽可能小。并且不会有任何链接器错误。