仅在CMake Release中“ glewInit()“缺少GL版本”构建]

问题描述 投票:1回答:1

我正在使用带有MSVC的CMake构建我的OpenGL项目。它与GLEW一起使用GLEW。当我使用--config Debug构建时,它运行良好,但是当我使用--config Release运行构建命令时,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项目,手动指定静态或动态链接,而实际上works!因此,看来这一定与我的CMake配置有关。

opengl cmake glfw glew
1个回答
1
投票

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

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

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

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

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