有人能解释一下
__imp__fprintf
和
__imp____iob_func
未解决的外部手段?
因为当我试图编译时,我会得到这些错误:
1>SDL2main.lib(SDL_windows_main.obj) : error LNK2019: unresolved external symbol __imp__fprintf referenced in function _ShowError
1>SDL2main.lib(SDL_windows_main.obj) : error LNK2019: unresolved external symbol __imp____iob_func referenced in function _ShowError
1>E:\Documents\Visual Studio 2015\Projects\SDL2_Test\Debug\SDL2_Test.exe : fatal error LNK1120: 2 unresolved externals我已经可以说,问题不在于连接错了。我把所有的东西都正确地连接起来了,但出于某种原因,它无法编译。
我正在尝试使用SDL2。
我正在使用Visual 2015作为编译器。
我已经链接到Linker SDL2main.lib中的SDL2.lib和->输入->附加依赖项,并确保VC++目录是正确的。
发布于 2015-06-17 14:20:15
我终于弄明白了为什么会发生这种事!
在visual studio 2015中,stdin、stderr、stdout的定义如下:
#define stdin (__acrt_iob_func(0))
#define stdout (__acrt_iob_func(1))
#define stderr (__acrt_iob_func(2))但在此之前,它们被定义为:
#define stdin (&__iob_func()[0])
#define stdout (&__iob_func()[1])
#define stderr (&__iob_func()[2])因此,现在不再定义__iob_func了,这将导致在使用使用以前版本的visual编译的.lib文件时出现链接错误。
为了解决这个问题,您可以自己定义__iob_func(),它应该返回一个包含{*stdin,*stdout,*stderr}的数组。
关于stdio函数的其他链接错误(在我的例子中是sprintf()),您可以将legacy_stdio_definitions.lib添加到链接器选项中。
发布于 2015-09-08 04:33:41
对国际海事组织的米兰巴布š科夫来说,这正是替换函数应该看起来的样子:-)
FILE _iob[] = {*stdin, *stdout, *stderr};
extern "C" FILE * __cdecl __iob_func(void)
{
return _iob;
}发布于 2016-04-08 16:09:55
微软在这方面有一个特别的说明(CRT):
-- printf和scanf函数族现在是内联定义的.。 所有printf和scanf函数的定义已经内联地移动到stdio.h、conio.h和其他CRT标头中。这是一个突破性的变化,它会导致链接器错误(LNK2019,未解析的外部符号)在本地声明这些函数而不包括适当的CRT的程序。如果可能,您应该更新代码以包含CRT头(即添加#include )和内联函数,但是如果您不想修改代码以包含这些头文件,另一种解决方案是向链接器输入legacy_stdio_definitions.lib.添加一个额外的库。 若要将此库添加到IDE中的链接器输入,请打开项目节点的上下文菜单,选择“属性”,然后在“项目属性”对话框中选择“链接器”,然后编辑链接器输入以将legacy_stdio_definitions.lib添加到分号分隔的列表中。 如果您的项目链接到使用早于2015年的VisualC++版本编译的静态库,则链接器可能会报告未解决的外部符号。这些错误可能引用_iob、_iob_func的内部stdio定义,或以__imp_*的形式引用特定stdio函数的相关导入。Microsoft建议您在升级项目时使用最新版本的VisualC++编译器和库重新编译所有静态库。如果库是一个源不可用的第三方库,则应从第三方请求更新的二进制文件,或者将该库的使用封装到一个单独的DLL中,然后使用较早版本的Visual编译器和库进行编译。
https://stackoverflow.com/questions/30412951
复制相似问题