如何使用 GLFW 预编译二进制文件编译 Visual Studio 2019 发行版

问题描述 投票:0回答:2

我正在尝试在 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++ visual-studio compiler-errors visual-studio-2019 glfw
2个回答
1
投票

这是编译器“安全检查”选项的问题(最有可能)。在您的项目设置中,转到 C/C++ 和“代码生成”的设置,您应在其中选择“禁用安全检查”或“启用安全检查”,以调试配置的设置(有效)为准。

但请检查此设置在您的调试版本和发布版本之间是否不同!我怀疑您必须选择与构建 GLFW 库时使用的设置相同的设置。


1
投票

根据Adrian的回答,我检查了该类别中的其他配置,发现“C/C++代码生成”下的“运行时库”选项有问题。在调试中,它设置为“多线程调试 DLL (/MDd)”,在发布中,它设置为“多线程 DLL (/MD)”。将其更改为调试 DLL 后,发布版本编译并运行没有问题。

这似乎是一个 glfw 错误,但对于它正在更改的设置来说,它是有效的

© www.soinside.com 2019 - 2024. All rights reserved.