gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 16:45:32 25 4
gpt4 key购买 nike

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

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

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

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

(我认为我可以通过使用编译器内在函数来摆脱 memcpy 问题,例如 #pragma intrinsic(memcpy) ,但这没有区别。)

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

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

最佳答案

__fltused意味着您正在使用或至少声明了一些浮点数或 double 数。编译器注入(inject)这个“无用”符号以导致从 crt 加载 float 支持 .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”的符号。如果build设置具有与内部函数相反的调试设置,则仍然可以导入内部函数——即使是明确请求的。因此,无论如何,您都需要在某个时候实现自己的 memcpy 和相关功能。

关于visual-c++ - 构建不使用 CRT 函数的 Visual C++ 应用程序仍然引用一些,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1583196/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com