Opengl glewInit();缺少GL版本“;仅在CMake发布版本中
我正在使用CMake和MSVC构建我的OpenGL项目。它使用GLEW和GLFW。当我使用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,但我已经尝试了这两种方法,并且
--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并在发布配置上关闭优化。只是想消除一些可能出错的事情