Opengl glewInit();缺少GL版本“;仅在CMake发布版本中

Opengl glewInit();缺少GL版本“;仅在CMake发布版本中,opengl,cmake,glfw,glew,Opengl,Cmake,Glfw,Glew,我正在使用CMake和MSVC构建我的OpenGL项目。它使用GLEW和GLFW。当我使用--config Debug构建时,它运行良好,但是当我使用--config Release运行build命令时,glewInit()失败。我尝试了64位和32位构建,它在调试中运行,但在这两种情况下都没有发布 我在CMakeLists.txt文件中使用了add_definitions(-DGLEW_STATIC),以避免在任何地方都需要#define GLEW_STATIC,但我已经尝试了这两种方法,并且

我正在使用CMake和MSVC构建我的OpenGL项目。它使用GLEW和GLFW。当我使用
--config Debug
构建时,它运行良好,但是当我使用
--config Release
运行build命令时,glewInit()失败。我尝试了64位和32位构建,它在调试中运行,但在这两种情况下都没有发布

我在CMakeLists.txt文件中使用了
add_definitions(-DGLEW_STATIC)
,以避免在任何地方都需要
#define GLEW_STATIC
,但我已经尝试了这两种方法,并且没有任何区别

我可以看到版本
glew.lib
正在生成(并且
glewd.lib
为调试版本生成),如果我在VS中检查项目属性,正确的属性在链接器输入列表中

在创建GL上下文之前,我尝试过使用和不使用窗口提示

有件事我不明白。为什么我的GL版本丢失,仅用于发布版本配置


编辑:添加最小可复制示例(感谢您的建议)

这是我的
CMakeLists.exe文件

cmake_minimum_required(VERSION 3.14)
project(Demo LANGUAGES CXX)

# Make sure GLEW gets built as a static lib
add_definitions(-DGLEW_STATIC)
option( glew-cmake_BUILD_SHARED "Build the shared glew library" OFF )
option( glew-cmake_BUILD_STATIC "Build the static glew library" ON )

# Build dependencies
add_subdirectory(glew)
add_subdirectory(glfw)

add_executable(demo demo/main.cpp)

target_compile_features(demo PUBLIC cxx_std_17)
target_compile_definitions(demo PRIVATE -D_SCL_SECURE_NO_WARNINGS)
target_include_directories(demo PUBLIC glew/include)
target_include_directories(demo PUBLIC glfw/include)

# Link dependencies
target_link_libraries(demo libglew_static glfw ${GLFW_LIBRARIES})
了解我的
glew
目录中的内容可能很重要

demo/main.cpp

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>
#include <cassert>

int main(int argc, char** argv)
{
    // Open a window and initialize Glew
    assert(glfwInit());
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); 
    GLFWwindow* window = glfwCreateWindow(600, 400, "window", 0, 0);
    glfwMakeContextCurrent(window);
    std::cout << "GLFW: " << glfwGetVersionString() << "\n";
    std::cout << "GLEW: " << glewGetString(GLEW_VERSION) << "\n";
    GLenum glewStatus = glewInit();
    if (glewStatus != GLEW_OK) {
        std::cout << "GLEW ERROR: " << glewGetErrorString(glewStatus) << "\n";
        exit(1);
    }
    std::cout << "GL:   " << glGetString(GL_VERSION) << "\n";

    // Shut down graphics
    glfwDestroyWindow(window);
    glfwTerminate();

    return 0;
}
如果生成并运行调试可执行文件,则在终止之前会打开一个窗口,输出为:

GLFW: 3.3.0 Win32 WGL EGL VisualC
GLEW: 2.2.0
GL:   3.2.0 - Build 25.20.100.6617
GLFW: 3.3.0 Win32 WGL EGL VisualC
GLEW: 2.2.0
GLEW ERROR: Missing GL version
我的发布构建命令是:

cmake ..
cmake --build . --config Debug
cmake ..
cmake --build . --config Release
如果我构建并运行发布可执行文件,我点击
退出(1)
行,输出为:

GLFW: 3.3.0 Win32 WGL EGL VisualC
GLEW: 2.2.0
GL:   3.2.0 - Build 25.20.100.6617
GLFW: 3.3.0 Win32 WGL EGL VisualC
GLEW: 2.2.0
GLEW ERROR: Missing GL version

更新:我已经尝试使用共享库(DLL)而不是静态库进行链接,并确认该错误仍在复制


更新:我试着从零开始构建一个VS项目,只使用我的最小可复制案例,手动指定静态或动态链接,它实际上是有效的!因此,似乎这一定与我的CMake配置有关。

我发现,如果我在VS中手动设置一个项目,我可以使用完全相同的链接运行发布版本。我将手动创建的vcxproj文件与CMake生成的文件进行了比较,以找出发布配置的差异。它归结为
NDEBUG
预处理器定义

我不明白为什么这个定义导致OpenGL找不到(我想这是另一个问题,但如果你能在这里回答,我会给你答案)。如果我加一行

string( REPLACE "/DNDEBUG" "" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")

对于我的CMakeLists.txt文件,我能够在发布模式下构建和运行

这可能与您忘记配置发布版和调试版有关。@tomerzeitune我同意,但我不知道需要更改什么-我可以看到适当的.libs是为glew生成的,并且在每种情况下都链接到。您是否可以尝试删除glfw提示,看看会发生什么?可能您未能创建有效的opengl上下文。是的,现在更清楚地了解正在发生的事情。@stett尝试链接到opengl32.lib并在发布配置上关闭优化。只是想消除一些可能出错的事情