我需要在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。我已经为尝试的每种解决方案重建了所有内容。
答案 0 :(得分:0)
为了在VS2017中编译静态链接SDL的DLL,您必须链接一些有点奇怪的定义。
当然,除了SDL2使用的imm32
,winmm
和version
库之外,如果要构建DLL,还必须包括msvcrt
和{ {1}}和vcruntime
。