【问题标题】:How to build the Qt + cmake + QGLWidget如何构建 Qt + cmake + QGLWidget
【发布时间】:2020-01-01 15:57:42
【问题描述】:

我正在尝试使用 cmake 和 opengl 构建最简单的 qt 项目。 我创建了默认项目并进行了少量修改。

当我尝试构建项目时,我得到了 9 个这样的错误: main.cpp.obj:-1: error: 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();
}

【问题讨论】:

    标签: c++ qt cmake


    【解决方案1】:

    在 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>
    // ...
    

    【讨论】:

    • 非常感谢。在我的情况下,qt 找不到 glut,因此在构建文件夹中手动添加了库并将最后一笔更改为:target_link_libraries(untitled2 PRIVATE Qt5::Widgets Qt5::OpenGL ${OPENGL_LIBRARIES} glut32)
    猜你喜欢
    • 2017-06-12
    • 1970-01-01
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多