这是至少两个密切相关但又截然不同的一系列问题的一部分。我希望通过分别询问他们来做正确的事情。
我正在尝试让我的 Visual C++ 2008 应用程序在没有 C 运行时库的情况下运行。它是一个 Win32 GUI 应用程序,没有 MFC 或其他花哨的东西,只是简单的 Windows API。
所以我将项目属性 -> 配置 -> C/C++ -> 高级 -> 省略默认库名称设置为是(编译器标志/Zl
)并重建。假设我已经编写了一个合适的入口点函数,这是我的另一个问题。 https://stackoverflow.com/questions/1583193/what-functions-does-winmaincrtstartup-perform
我收到两个链接器错误;他们可能是相关的。链接器抱怨无法解析的外部符号__fltused
and _memcpy
in foobar.obj
。不用说,我在程序中没有明确使用这两种方法,但我确实使用了memcpy
某处foobar.cpp
。 (我会用CopyMemory http://msdn.microsoft.com/en-us/library/aa366535(VS.85).aspx但事实证明是#define
d 与 相同memcpy
...)
(我以为我可以摆脱memcpy
通过使用编译器内在函数来解决问题,例如#pragma intrinsic(memcpy)
,但这没有什么区别。)
如果我查看预处理器输出(添加/P
到编译器命令行),我看不到对任何一个的引用__fltused
or _memcpy
in foobar.i
.
所以,我的问题是:这些链接器错误从何而来,如何解决它们?
__fltused
意味着您正在使用或至少声明了一些浮点数或双精度数。编译器注入这个“无用”符号来导致从 crt 加载浮动支持 .obj。您可以通过简单地声明一个带有名称的符号来解决这个问题
#ifdef __cplusplus
extern "C" {
#endif
int _fltused=0; // it should be a single underscore since the double one is the mangled name
#ifdef __cplusplus
}
#endif
WRT _memcpy - memcpy 是一个 __cdecl 函数,所有 cdecl 函数都会自动获得一个 _ 作为其装饰的一部分。因此,当您说“__cdecl memcpy”时,编译器和链接器会寻找名为“_memcpy”的符号。如果构建设置具有反对指示内在函数的调试设置,则仍然可以导入内在函数(即使是明确请求的)。因此,无论如何,您都需要在某个时候实现自己的 memcpy 和相关函数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)