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

Posted

技术标签:

【中文标题】如何使用 GLFW 预编译的二进制文件编译 Visual Studio 2019 发行版【英文标题】:How to compile Visual Studio 2019 release build with GLFW pre-compiled binaries 【发布时间】:2019-08-29 03:34:48 【问题描述】:

我正在尝试在 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()

我猜代码不是问题;但这是由一些我不知道的编译器设置引起的,默认情况下在发布配置中有所不同。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

看起来两个配置对于​​该设置是相同的(它设置为启用安全检查)。但在同一类别中,基本运行时检查、运行时库和启用函数级链接具有不同的选项。这些可能是问题吗?【参考方案2】:

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

这似乎是一个 glfw 错误,但它正在更改此设置的原因

【讨论】:

很高兴它成功了!但是,当其他所有内容都设置为“发布”选项(例如,NDEBUG 已定义)时,使用 /MDd 构建选项有时会导致其他问题。 我会联系 GLFW 人员,让他们知道他们已经发布了调试版本。

以上是关于如何使用 GLFW 预编译的二进制文件编译 Visual Studio 2019 发行版的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL配置GLFW与GLEW的问题

GLFW 窗口仅显示 Clear Color 而没有其他内容

C语言——编译器如何将C源文件编译成可执行代码?

如何将预编译的二进制文件与电子捆绑在一起

将预编译的二进制文件捆绑到电子应用程序中

为啥很多项目不提供预编译的二进制文件?