glewInit()仅在CMake版本中生成“缺少GL版本”

时间:2019-10-18 05:48:40

标签: opengl cmake glfw glew

我正在使用带有MSVC的CMake构建我的OpenGL项目。它与GLEW一起使用GLEW。当我使用--config Debug构建时,它运行良好,但是当我使用--config Release运行build命令时,glewInit()失败。我已经尝试了64位和32位版本,并且都可以在调试中运行,但在两种情况下均不能发布。

我在CMakeLists.txt文件中使用了add_definitions(-DGLEW_STATIC),以避免到处都需要#define GLEW_STATIC,但是我同时尝试了两者,但没有什么区别。

我可以看到已经发布了版本glew.lib(并且已经生成了glewd.lib用于调试版本),如果我在VS中检查项目属性,则正确的链接位于链接器列表中输入。

在创建GL上下文之前,我尝试过有无窗口提示。

这里有些事情我不理解。为什么我的GL版本丢失了,仅用于发布版本配置?


编辑:添加最小的可复制示例(建议使用squareskittles)。

这是我的CMakeLists.exe file

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-cmake是我的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;
}

我的构建命令从CMakeLists.txt文件级别以下的目录运行。我的调试构建命令是:

cmake ..
cmake --build . --config Debug

如果我构建并运行调试可执行文件,则会在终止之前打开一个窗口,输出为:

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

我的发布构建命令是:

cmake ..
cmake --build . --config Release

如果我生成并运行发行版可执行文件,则点击exit(1)行,输出为:

GLFW: 3.3.0 Win32 WGL EGL VisualC
GLEW: 2.2.0
GLEW ERROR: Missing GL version

更新:我已经尝试过与共享库(dll)而不是静态库进行链接,并且确认该错误仍在再现。

更新:我尝试仅使用最小的可重现性案例从头开始构建VS项目,手动指定静态或动态链接,并且实际上有效!因此,看来这一定与我的CMake配置有关。

1 个答案:

答案 0 :(得分:1)

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

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

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

在我的CMakeLists.txt文件中,我可以在发布模式下构建和运行!