无法在 VS 2019 上为 SDL 库的发布模式构建解决方案

Can't build solution in release mode for SDL library on VS 2019

提问人:Neri-kun 提问时间:10/8/2019 最后编辑:Neri-kun 更新时间:3/5/2020 访问量:2519

问:

enter image description here

我尝试从这个特定的链接下载 SDL 库 https://www.youtube.com/watch?v=PTQkCRxr6lk&t=194s .然而,我偶然发现了一个“致命错误”,我不知道该怎么做才能解决它。

这是我收到的错误:

1>------ Build started: Project: SDL2, Configuration: Release x64 ------
2>------ Skipped Build: Project: uninstall, Configuration: Release x64 ------
2>Project not selected to build for this solution configuration 
1>   Creating library D:/Media/Downloads/SDL2-2.0.10/Build/Release/SDL2.lib and object D:/Media/Downloads/SDL2-2.0.10/Build/Release/SDL2.exp
1>SDL_string.obj : error LNK2019: unresolved external symbol memset referenced in function SDL_vsnprintf_REAL
1>D:\Media\Downloads\SDL2-2.0.10\Build\Release\SDL2.dll : fatal error LNK1120: 1 unresolved externals
1>Done building project "SDL2.vcxproj" -- FAILED.
3>------ Skipped Build: Project: INSTALL, Configuration: Release x64 ------
3>Project not selected to build for this solution configuration 
========== Build: 0 succeeded, 1 failed, 4 up-to-date, 2 skipped ==========
c cmake sdl visual-studio-2019 未解析外部

评论

0赞 genpfault 10/9/2019
您是如何调用 CMake 来生成该 Visual Studio 项目的?
0赞 Neri-kun 10/9/2019
你是什么意思?
0赞 Tsyvarev 10/9/2019
在调试代码问题时,图像不是那么有用。相反,将日志作为文本复制粘贴到问题帖子中,并将该文本格式化为代码(使用 或 按钮)。另请参阅如何提问Ctrl+K{}
0赞 Neri-kun 10/9/2019
@Tsyvarev我不知道代码是否是问题本身。既然那家伙成功编译了那段代码,我想我也应该这样做。
0赞 Tsyvarev 10/9/2019
但是错误消息绝对很重要,它应该作为文本而不是图像出现在问题帖子中。

答:

9赞 Michael Chen 10/17/2019 #1

@Neri-kun,我在VS2019上构建SDL2时遇到了完全相同的问题。似乎在 中,其中不包括在 中。因此,在中找到以下部分并添加到 .已解决的问题:memsetvcruntime.dllCMakeLists.txtCMakeLists.txtvcruntimeEXTRA_LIBS

   # Libraries for Win32 native and MinGW
-  list(APPEND EXTRA_LIBS user32 gdi32 winmm imm32 ole32 oleaut32 version uuid advapi32 shell32)
+  list(APPEND EXTRA_LIBS vcruntime user32 gdi32 winmm imm32 ole32 oleaut32 version uuid advapi32 shell32)

评论

0赞 Neri-kun 10/28/2019
以下部分是什么意思?关于,这是我发现的所有内容: PS:很抱歉在 10 天后回复,我只是推迟了我的项目。CMakeLists.txtcmake_minimum_required(VERSION ${CMAKE_VERSION}) project(IntelFortranImplicit Fortran) add_custom_command( OUTPUT output.cmake COMMAND ${CMAKE_COMMAND} -P ${IntelFortranImplicit_SOURCE_DIR}/detect.cmake ) add_library(FortranLib hello.f output.cmake)
1赞 JPNotADragon 12/29/2019
根据当前版本 2.0.10,还有一个额外的特定于 Windows 的库要包含,因此该行变为:setupapilist(APPEND EXTRA_LIBS vcruntime user32 gdi32 winmm imm32 ole32 oleaut32 version uuid advapi32 setupapi shell32)
0赞 edin-m 8/27/2020
SDL 2.0.12 仍然存在此问题。将 vcruntime 添加到列表中可以使其工作。
0赞 Brian Whitman 3/5/2020 #2

这实际上是一个编译器优化问题。某些东西不恰当地内联了对 memset 的调用。如果检查 SDL_string.c 文件,您会发现 HAVE_MEMSET 未定义,因此没有调用 memset。VisualC 文件夹中提供的解决方案文件可以正确构建发布配置。如果检查 cmake 生成的解决方案与 VisualC 文件夹中的解决方案之间的差异,您应该会发现 cmake 生成的版本内联了任何合适的函数,而 VisualC 文件夹中的版本仅内联了标记__inline函数 (/Ob1)。