在没有CRT,Memcpy和Memset固有函数的情况下链接误差
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,我也不使用它。从我的理解来看,启用了内在功能,都应包括内存和memset。由于我的代码太长了,因此以下是我程序中的win api呼叫:
- lstrcpy
- wsprintf
- copymemory-当我评论此评论时,错误切换到_memset
- OpenFileMapping
- mapviewoffile
- CreateFileMapping
我的问题:
- 如果我声明/oi,为什么不包括固有函数?
- 我需要自己声明Memset和memcpy吗?
- 如果是这样,我该如何在没有视觉工作室抱怨内在函数的重新定义的情况下这样做?
/Oi
并未记录为一定要在可能的情况下插入所有内在物质,而仅使编译器可以选择这样做。我无法弄清楚MSVC用来得出最终结论的逻辑,但是某些因素包括项目模式(与调试相比,更有可能在发行中注入内在物质)和功能的长度。<<<<<<<<<<<<<</p>
最新版本的Visual Studio确实将MSVCRT依赖项集成到编译器中,并且生成不取决于标准C运行时的代码变得越来越困难。
围绕这些问题工作的标准方式(尽管Microsoft被Microsoft低估了)是针对MSVCRT.dll的系统副本链接,该副本以某种形式或其他形式heps 带有所有版本的Windows。只要您使用标准C函数,例如memset
,您就可以非常忽略Microsoft的不赞成的刺眼并将其链接到您的心脏内容,但不要尝试将其用于CRT提供的更复杂的功能和API。
要针对MSVCRT.dll链接,您需要使用LoadLibrary
并使用CO或使用预先生成的MSVCRT.LIB(Microsoft有意地提供一个)才能告诉MSVC MSVC System Mscrt.dll中有哪些功能可用
更新:现在,我们发布X86和X64平台与CRT静态链接的静态链接的mscvrt.lib
文件:https://github.com/neosmart/neosmart/msvcrt.libt.lib
memset()
来自 ZeroMemory()
在击中此事时,我刚刚输入了" C编程语言"中的memcpy,memmove,memset的规范定义。
我面临类似的问题,将vcruntime.lib
添加到链接器选项中,然后重建对我有帮助。
您无法避免链接到CRT。但是,为了减小EXE的大小,您可以静态链接到CRT。链接器将剥离所有不需要的CRT代码,因此您的应用程序将尽可能小。而且不会有任何链接器错误。
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 在不传递参数数量且只有3个点的情况下,如何使用变差函数
- 在这种情况下,java对象是否可以调用本机函数
- 这个c++代码是如何在没有定义函数的情况下运行的
- 为什么不调用移动构造函数?(默认情况下只有构造器,没有别的)
- 如何在没有函数的情况下编写此代码并使C++更简单?
- 在这种情况下显式调用时,std::cout 如何更改析构函数的行为?
- A类的定义需要B类的定义,如何在不公开B的定义的情况下公开A的公共函数?
- 如何在不使用指针的情况下将派生类的对象作为参数传递给基类中的函数?
- 有没有办法在不使用 #ifdef 的情况下不编译发布版本中的单元测试函数体?
- C++ strcpy 函数在少数主要情况下失败
- C++有什么方法可以在既不调用函数模板也不提供其模板参数的情况下引用函数模板?
- 是否可以在不填充自己的参数的情况下将模板函数作为参数传递?
- 如何在没有复制构造函数的情况下为地图设置值?
- 在这种情况下,如何传递成员函数而不是函数?
- C++:带有大括号初始化列表的函数调用表达式 - 标准是否规定在单个元素列表的微不足道的情况下忽略大括号?
- 构造函数/解构函数情况下的'undefined reference to vtable for'
- c#和c++中虚函数情况下编译器行为的差异.这是我在一次采访中被问到的问题