首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >未解析的外部符号__imp__fprintf和__imp____iob_func,SDL2

未解析的外部符号__imp__fprintf和__imp____iob_func,SDL2
EN

Stack Overflow用户
提问于 2015-05-23 12:58:16
回答 19查看 151.4K关注 0票数 123

有人能解释一下

__imp__fprintf

__imp____iob_func

未解决的外部手段?

因为当我试图编译时,我会得到这些错误:

代码语言:javascript
运行
复制
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++目录是正确的。

EN

回答 19

Stack Overflow用户

回答已采纳

发布于 2015-06-17 14:20:15

我终于弄明白了为什么会发生这种事!

在visual studio 2015中,stdin、stderr、stdout的定义如下:

代码语言:javascript
运行
复制
#define stdin  (__acrt_iob_func(0))
#define stdout (__acrt_iob_func(1))
#define stderr (__acrt_iob_func(2))

但在此之前,它们被定义为:

代码语言:javascript
运行
复制
#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添加到链接器选项中。

票数 141
EN

Stack Overflow用户

发布于 2015-09-08 04:33:41

对国际海事组织的米兰巴布š科夫来说,这正是替换函数应该看起来的样子:-)

代码语言:javascript
运行
复制
FILE _iob[] = {*stdin, *stdout, *stderr};

extern "C" FILE * __cdecl __iob_func(void)
{
    return _iob;
}
票数 66
EN

Stack Overflow用户

发布于 2016-04-08 16:09:55

微软在这方面有一个特别的说明(CRT):

-- printf和scanf函数族现在是内联定义的.。 所有printf和scanf函数的定义已经内联地移动到stdio.hconio.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编译器和库进行编译。

票数 49
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30412951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档