构建不使用CRT函数的Visual C ++应用程序仍引用一些

问题描述 投票:6回答:2

这是一系列至少两个密切相关但不同的问题的一部分。我希望我能分别问他们做对了。

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

所以我将Project Properties - > Configuration - > C / C ++ - > Advanced - > Omit Default Library Names设置为Yes(编译器标志/Zl)并重建。让我假装我写了一个合适的入口点函数,这是my other question.的主题

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

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

如果我查看预处理器输出(将/P添加到编译器命令行),我在__fltused中看不到对_memcpyfoobar.i的引用。

所以,我的问题是:这些链接器错误来自何处,以及如何解决它们?

visual-c++ linker crt
2个回答
10
投票

__fltused暗示你正在使用或至少声明了一些花车或双打。编译器注入此“无用”符号以使浮动支持.obj从crt加载。您可以通过简单地声明带有名称的符号来解决这个问题

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.