【发布时间】:2018-09-17 21:25:42
【问题描述】:
我需要在 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)构建所有东西,而且如果我不静态链接它也没有问题。
我已经尝试了那里的解决方案(重建不适用,添加定义,包括legacy_stdio_definitions.lib)无济于事。
我只能假设问题出在我静态链接的代码中(因为静态构建包含所有内容)。
如果有人想要重现,这很简单,您只需构建 SDL-static 并将库包含在 DLL 项目中。如果您包含 SDL2.lib(动态)它可以工作,如果您在 .exe 项目中包含 SDL2-static.lib 它也可以工作。
PS:我使用相同的 SDK 和工具集来编译 SDL 和静态链接它的 DLL。我已经为我尝试过的每个解决方案重新构建了所有内容。
【问题讨论】:
-
显然您使用的 SDL2 的静态构建动态链接了 Microsoft 运行时库。
-
@Cheersandhth.-Alf 谢谢。这对我来说不是很明显,但你的评论是正确的。不幸的是,我显然不能给你任何声望点,所以请接受我的感谢:)。