我正在尝试在Visual Studio 2019中构建一个使用GLFW预编译静态库的程序(如果重要的话,它是针对Vulkan而不是OpenGL的(。当我在调试模式下构建时,它可以很好地编译。当我在发布模式下编译时,出现以下错误:
Error LNK2001 unresolved external symbol __security_check_cookie [myapp] [project_path]glfw3.lib(win32_joystick.obj) 1
Error LNK2001 unresolved external symbol __security_check_cookie [myapp] [project_path]glfw3.lib(wgl_context.obj) 1
Error LNK2001 unresolved external symbol __security_check_cookie [myapp] [project_path]glfw3.lib(egl_context.obj) 1
Error LNK2001 unresolved external symbol __security_check_cookie [myapp] [project_path]glfw3.lib(osmesa_context.obj) 1
Error LNK2001 unresolved external symbol __security_check_cookie [myapp] [project_path]glfw3.lib(input.obj) 1
Error LNK2001 unresolved external symbol __security_check_cookie [myapp] [project_path]glfw3.lib(win32_init.obj) 1
Error LNK2001 unresolved external symbol __security_check_cookie [myapp] [project_path]glfw3.lib(win32_monitor.obj) 1
Error LNK2001 unresolved external symbol __security_check_cookie [myapp] [project_path]glfw3.lib(context.obj) 1
还有更多错误,就像与GLFW相关的错误一样。
我已经检查过:
a( 我的调试和发布配置在链接到 GLFW 时配置完全相同。
b( glfw3.lib 文件来自 lib-VC2019 文件夹中预编译二进制文件的最新下载。
c( 它们是 64 位二进制文件,调试和发布都在 64 位模式下构建
只是为了测试,我还尝试了 32 位二进制文件(显然不起作用(,并且我还删除了库,以确保两个版本都给出相同的错误消息(它们确实如此(
我使用的唯一 glfw 函数是
glfwInit()
glfwGetRequiredInstanceExtensions()
glfwCreateWindow()
glfwCreateWindowSurface()
glfwDestroyWindow()
glfwTerminate()
我猜代码不是问题;但它是由一些我不知道的编译器设置引起的,默认情况下在发布配置中是不同的。
这是编译器"安全检查"选项的问题(很可能(。在项目设置中,转到 C/C++ 和"代码生成"的设置,您应该在其中选择"禁用安全检查"或"启用安全检查",以调试配置(有效(的设置为准。
但是请检查此设置在调试版本和发布版本之间是否不同!我怀疑您必须选择与构建 GLFW 库时使用的设置相同的设置。
根据 Adrian 的回答,我检查了该类别中的其他配置,发现"C/C++ 代码生成"下的"运行时库"选项是问题所在。在调试中,它设置为"多线程调试 DLL (/MDd(",在发布中设置为"多线程 DLL (/MD("。将其更改为调试 DLL 后,发布版本将编译并运行,而不会出现问题。
这似乎是一个 glfw 错误,但对于它正在更改此设置的内容,此设置有效