【问题标题】:Can't link SDL2-static.lib in a DLL无法在 DLL 中链接 SDL2-static.lib
【发布时间】: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 谢谢。这对我来说不是很明显,但你的评论是正确的。不幸的是,我显然不能给你任何声望点,所以请接受我的感谢:)。

标签: c++ linker sdl sdl-2


【解决方案1】:

为了在 VS2017 中编译静态链接 SDL 的 DLL,您必须链接一些有点分散的定义。

除了 SDL2 使用的 imm32winmmversion 库之外,如果您正在构建 DLL,您还必须包含 msvcrt 以及 vcruntimeucrt

【讨论】:

    猜你喜欢
    • 2020-02-09
    • 1970-01-01
    • 2015-02-09
    • 2020-04-22
    • 1970-01-01
    • 2016-06-28
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    相关资源
    最近更新 更多