9

这是一系列至少两个密切相关但不同的问题的一部分。我希望我通过单独询问他们来做正确的事情。

我试图让我的 Visual C++ 2008 应用程序在没有 C 运行时库的情况下工作。这是一个 Win32 GUI 应用程序,没有 MFC 或其他花哨的东西,只是普通的 Windows API。

所以我将 Project Properties -> Configuration -> C/C++ -> Advanced -> Omit Default Library Names 设置为 Yes (compiler flag /Zl) 并重建。假设我已经编写了一个合适的入口点函数,这是我另一个问题的主题。

我收到两个链接器错误;他们可能是相关的。链接器抱怨未解析的外部符号__fltused_memcpy. foobar.obj不用说,我在我的程序中都没有明确使用,但我确实memcpyfoobar.cpp. (我会使用CopyMemory但结果是#defined 与memcpy...相同)

(我想我可以memcpy通过使用编译器内在函数来解决这个问题,比如#pragma intrinsic(memcpy),但这没有区别。)

如果我查看预处理器输出(添加/P到编译器命令行),我看不到任何__fltused_memcpyin 的引用foobar.i

所以,我的问题是:这些链接器错误来自哪里,我该如何解决?

4

2 回答 2

15

__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 和相关功能。

于 2009-10-17T21:10:42.703 回答
1

我建议为 foobar.cpp 设置一次“生成汇编列表”(或类似的)编译器选项,然后检查汇编代码。这应该真正告诉您这些符号的使用位置。

于 2009-10-17T21:08:33.697 回答