SDL2 2.0.18 与 VS 2019 的静态链接,(memcpy 已经定义了错误 MT 设置。)

Static linking of SDL2 2.0.18 with VS 2019, (memcpy already defined bug MT setting.)

我尝试编译 link 一个非常简单的 SDL2 示例代码。 它适用于以下所有配置:

当我用 x64、release 和 \MT 编译和 link 时,我得到这个错误:

错误 LNK2005 memcpy 已在 SDL2.lib(SDL_stdlib.obj) c:\SDL2\libcruntime.lib
中定义 (memcpy.obj)

这是同样的问题。

https://github.com/libsdl-org/SDL/issues/3662

下面是我的 C++ 编译器命令行: /permissive- /ifcOutput "x64 Release" /GS /GL /W3 /Gy /Zc:wchar_t /Zi /Gm- /O2 /sdl /Fd"x64 Release\vc142.pdb" /Zc:inline /fp:precise /D "NDEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /Gd /Oi /MT /FC /Fa"x64 Release" / EHsc /nologo /Fo"x64 Release" /Fp"x64 Release\SDL2.pch" /diagnostics:column

这里是 linker 命令行: /OUT:"C:\Users\jerry\source\repos\SDL2\x64 Release\SDL2.exe" /MANIFEST /LTCG:incremental /NXCOMPAT /PDB:"C:\Users\jerry\source\repos\SDL2\x64 Release\SDL2.pdb" /DYNAMICBASE "SDL2main.lib" "zlib.lib" "libpng16.lib" "libwebp.lib" "jpeg.lib" "SDL2_image.lib" "SDL2.lib" "winmm.lib" "imm32.lib" "version.lib" "Setupapi.lib" "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" /DEBUG /MACHINE:X64 /OPT:REF /INCREMENTAL:NO /PGD:"C:\Users\jerry\source\repos\SDL2\x64 Release\SDL2.pgd" /SUBSYSTEM:CONSOLE /MANIFESTUAC:" level='asInvoker' uiAccess='false'" /ManifestFile:"x64 Release\SDL2.exe.intermediate.manifest" /LTCGOUT:"x64 Release\SDL2.iobj" /OPT:ICF / ERRORREPORT:PROMPT /ILK:"x64 Release\SDL2.ilk" /NOLOGO /LIBPATH:"D:\SDL2Lib\x64" /TLBID:1

那么如何在 VS 2019 和 x64 以及 \MT 设置下使用它呢? pragma guards 能以某种方式工作吗?我学到的是优化器正在做 memcpy 和其他事情。

感谢 keltar 关于 SDL_LIBC 标志的建议

解决方案在文件中 SDL_config.h 从第 32 行开始更改以下内容

#if defined(__WIN32__)
#include "SDL_config_windows.h"
#elif defined(__WINRT__)
....

然后改成这个

#if defined(__WIN32__)
#if defined(_WIN64)
#define HAVE_LIBC 1
#endif
#include "SDL_config_windows.h"
#elif defined(__WINRT__)
....