c++ - 如何构建 Qt + cmake + QGLWidget

标签 c++ qt cmake

我正在尝试使用 cmake 和 opengl 构建最简单的 qt 项目。 我创建了默认项目并做了一些修改。

当我尝试构建项目时,出现 9 个如下错误: main.cpp.obj:-1: 错误:LNK2019: ññûëêà íà íåðàçðåøåííûé âíåøíèé ñèìâîë __imp__glBegin@4 â ôóíêöèè "private: virtual void __thiscall GLWidget::paintGL(void)"(?paintGL@GLWidget@@EAEXXZ)

我应该做什么来构建该项目?

我的代码: CMakeLists.txt:

cmake_minimum_required(VERSION 3.5)

project(untitled2 LANGUAGES CXX)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

add_executable(untitled2
  main.cpp
)

find_package(OpenGL)

find_package(Qt5 COMPONENTS Widgets OpenGL REQUIRED)

target_link_libraries(untitled2 PRIVATE Qt5::Widgets Qt5::OpenGL)

main.cpp

#include "QApplication"
#include "QGLWidget"
#include "QDebug"
#include "cmath"

class GLWidget : public QGLWidget{
    void initializeGL(){
        /// In modelview hand is at origin
        glClearColor(1.0, 1.0, 1.0, 1.0);
    }

    void qgluPerspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar){
        const GLdouble ymax = zNear * tan(fovy * 3.14 / 360.0);
        const GLdouble ymin = -ymax;
        const GLdouble xmin = ymin * aspect;
        const GLdouble xmax = ymax * aspect;
        glFrustum(xmin, xmax, ymin, ymax, zNear, zFar);
    }

    /// @note camera decides renderer size
    void resizeGL(int width, int height){
        if (height==0) height=1;
        glViewport(0,0,width,height);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        qgluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
     }

    void paintGL(){
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        glClear(GL_COLOR_BUFFER_BIT);

        glBegin(GL_POLYGON);
            glVertex2f(-0.5, -0.5);
            glVertex2f(-0.5, 0.5);
            glVertex2f(0.5, 0.5);
            glVertex2f(0.5, -0.5);
        glEnd();
    }
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    GLWidget widget;
    widget.resize(640,480);
    widget.show();
    return app.exec();
}

最佳答案

在 Linux (Arch Linux) 中,必须链接 GLUT(使用 this answer 作为基础):

cmake_minimum_required(VERSION 3.5)

project(untitled2 LANGUAGES CXX)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

add_executable(untitled2
  main.cpp
)

find_package(OpenGL REQUIRED)
find_package(GLUT REQUIRED)
find_package(Qt5 COMPONENTS Widgets OpenGL REQUIRED)

target_link_libraries(untitled2 PRIVATE Qt5::Widgets Qt5::OpenGL ${OPENGL_LIBRARIES} ${GLUT_LIBRARY})

此外,当您包含系统或第三方库时,您必须使用 <>而不是""所以你必须更改为:

#include <QApplication>
#include <QGLWidget>
#include <QDebug>
#include <cmath>
// ...

关于c++ - 如何构建 Qt + cmake + QGLWidget,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59553927/

相关文章:

C++ WinAPI TextOut() 更新文本

c++ - 成员变量(属性)可以驻留在 C++ 中的寄存器中吗?

c++ - Qt 应用程序未运行

qt - 如何在我的 Qt 应用程序中添加 Google map ?

c++ - 找不到 Glog(缺少 : GLOG_INCLUDE_DIR GLOG_LIBRARY)

visual-studio - 如何使用CMake生成具有32位和64位配置的VS proj

c++ - 从 const std::string 转换为 std::string& 的错误 C2664

c++ - 为什么 bitand 没有正确解析以形成右值引用?

c++ - Qt:使 QHBoxLayout 可滚动

c++ - 在 CMakePresets.json 中合并和/或覆盖不同配置预设的标志