我正在使用带有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配置有关。
答案 0 :(得分:1)
我发现,如果我在VS中手动设置一个项目,则可以使发布版本以完全相同的链接运行。我将手动创建的vcxproj文件与CMake生成的文件进行了比较,以找出发行版配置之间的差异。它归结为NDEBUG
预处理程序定义。
我不明白为什么这个定义会导致找不到OpenGL(我想这是另一个问题,但是如果您可以在此处回答,我会给您答案)。如果我添加行
string( REPLACE "/DNDEBUG" "" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
在我的CMakeLists.txt文件中,我可以在发布模式下构建和运行!