1. ホーム
  2. c++

[解決済み] 未解決の外部シンボル __imp__fprintf および __imp____iob_func, SDL2

2022-08-29 16:20:19

質問

の意味について、どなたか説明してください。

__imp__fprintf

インプ_____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 Studio 2015を使っています。

Linker -> Input -> Additional Dependencies で SDL2.lib と SDL2main.lib にリンクし、VC++ Directories が正しいことを確認しました。

どのように解決するのですか?

ようやく原因がわかりました。

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 Studio でコンパイルされた .lib ファイルを使用するとリンクエラーが発生するようになりました。

この問題を解決するために __iob_func() を含む配列を返します。 {*stdin,*stdout,*stderr} .

stdio関数に関する他のリンクエラーについて(私の場合、それは sprintf() を追加することができます。 legacy_stdio_definitions.lib を追加してください。 をリンカーオプションに追加してください。