我需要在DLL中静态链接SDL2,但我有这个错误:LNK2019: unresolved external symbol __imp___acrt_iob_func referenced in function "void __cdecl `dynamic initializer for '__iob_func''(void)" (??__E__iob_func@@YAXXZ)
奇怪的是,当我构建一个.exe
时,一切正常,但是当我将配置类型更改为.dll
时却没有。我发现了以下问题:unresolved external symbol __imp__fprintf and __imp____iob_func, SDL2看起来像重复,但不仅我用相同的编译器(VS2017)构建所有东西,但如果我不静态链接它我也没有问题。
我试过那里的解决方案(重建是N / A,添加定义,包括legacy_stdio_definitions.lib
)无济于事。我只能假设问题出在我静态链接的代码中(因为静态构建包含所有内容)。
如果有人想要重现,那很简单,你只需构建SDL-static并将库包含在DLL项目中。如果你包含SDL2.lib(动态)它可以工作,如果你在.exe
项目中包含SDL2-static.lib它也可以。
PS:我使用相同的SDK和工具集来编译SDL和静态链接它的DLL。我为我尝试的每个解决方案重建了一切。
为了在VS2017中编译一个静态链接SDL的DLL,你必须链接一些有点划分的定义。
当然除了SDL2使用的imm32
,winmm
和version
库,如果你正在构建DLL,你还必须包括msvcrt
,vcruntime
和ucrt
。