2015-11-05 36 views
6

Tôi đã cố gắng xây dựng một ứng dụng OpenGL đơn giản với Qt 5.5.1 và mọi thứ đều ổn cho đến khi tôi thử sử dụng các hàm gọi hàm bản địa OpenGL như glClearColor.Qt 5.5 Lỗi liên kết QOpenGLWidget không liên kết bất kỳ cuộc gọi OpenGL nào

Widget thực sự biên dịch và tạo ra một màn hình màu đen, nhưng sau khi tôi cố gắng sử dụng bất kỳ chức năng có nguồn gốc OpenGL nó thậm chí không liên kết, nhưng tạo ra các lỗi:

glwidget.cpp:10: error: undefined reference to '[email protected]'

Đây là .pro tệp:

  QT  += core gui opengl 

      CONFIG += windows 

      greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 

      TARGET = Vehicle_simulation 

      TEMPLATE = app 

      SOURCES += main.cpp\ 
        simulation.cpp \ 
       glwidget.cpp 

      HEADERS += simulation.h \ 
       glwidget.h 

      FORMS += simulation.ui 

Tôi đang sử dụng bộ công cụ trên máy tính để bàn Qt mingw492_32. Điều lạ lẫm là tôi không tìm thấy libQtOpenGL.so trong thư mục lib. Cài đặt QT của tôi có bị lỗi không? Tôi đã cố gắng cài đặt lại nó nhiều lần, nhưng nó không giúp được gì. Tôi có thể tải xuống thư viện cụ thể đó ở đâu?

liên kết nó với dự án sẽ giải quyết được vấn đề, nhưng tôi dường như không thể tìm thấy nó ở bất cứ đâu.

Sự cố là mô-đun OpenGL bị thiếu trong quá trình cài đặt QT, không phải là mà tôi không thể liên kết với nó.

+0

@genpfault, không phải là cầu kỳ, nhưng đề xuất trùng lặp là sai. Tôi tìm thấy nguồn gốc của vấn đề và đó là vì QT theo mặc định được xây dựng với ANGLE, chỉ hỗ trợ OpenGL ES chứ không phải OpenGL trên máy tính để bàn. Để giải quyết điều này, tôi phải làm một tùy chỉnh xây dựng của QT Core với OpenGL trong đó. Tôi muốn được nhiều hơn, vui mừng hơn để trả lời câu hỏi nếu ai đó wouléd gặp phải vấn đề này. –

+0

Sau khi mở một dự án openGL ví dụ được biên dịch và liên kết, tôi tìm thấy nguồn gốc của vấn đề, nó không phải là lỗi liên kết, tôi đã sử dụng sai cài đặt GLWIdget, tôi sẽ đăng câu trả lời ngay khi tôi có thể biên dịch đủ suy nghĩ . –

Trả lời

8

Sau khi tôi đã mở một chương trình ví dụ một cách tình cờ, chỉ để xem xét triển khai; Tôi thấy rằng cùng một QOpenGLWidget đã được triển khai trong một chương trình mẫu mới.

Sau một chút phân tích, tôi đã tìm ra được vấn đề.

QT cũng có triển khai OpenGL nội bộ và hỗ trợ OpenGL gốc. Tiện ích con tôi đã sử dụng được kế thừa từ QOpenGLWidget, nhưng các hàm gọi hàm OpenGL (như glClearColor) đã cố gắng truy cập vào triển khai OpenGL gốc trong Qt. Vì những thứ đó không có trong bản xây dựng Qt của tôi, dự án sẽ không xây dựng.

Để khắc phục điều này phải chạy một bản dựng lõi Qt tùy chỉnh hoặc sử dụng trình bao bọc OpenGL do Qt cung cấp.

Tôi đã sử dụng trình bao bọc Qt ở cuối, cũng được sử dụng bởi chương trình ví dụ Cube. lớp được sử dụng để triển khai tiện ích (được gọi là GLWidget trong triển khai của tôi) phải kế thừa không chỉ từ QOpenGLWidget mà còn từ QOpenGLFunctions. Phần sau bị thiếu trong quá trình thực hiện của tôi. Mã nguồn của nó là như sau:

glwidget.h (ban đầu):

#ifndef GLWIDGET_H 
#define GLWIDGET_H 


#include <QOpenGLFunctions> 
#include <QOpenGLWidget> 

class GLWidget : public QOpenGLWidget 
{ 
    Q_OBJECT 

public: 
    explicit GLWidget(QWidget *parent); 

protected: 
    void initializeGL(); 
    void paintGL(); 
    void resizeGL(int w, int h); 
}; 

#endif // GLWIDGET_H 

glwidget.h (cố định):

#ifndef GLWIDGET_H 
#define GLWIDGET_H 


#include <QOpenGLFunctions> 
#include <QOpenGLWidget> 

class GLWidget : public QOpenGLWidget, protected QOpenGLFunctions 
{ 
    Q_OBJECT 

public: 
    explicit GLWidget(QWidget *parent); 

protected: 
    void initializeGL() Q_DECL_OVERRIDE; 
    void paintGL() Q_DECL_OVERRIDE; 
    void resizeGL(int w, int h) Q_DECL_OVERRIDE; 
}; 

#endif // GLWIDGET_H 

Hãy cẩn thận!

Trước khi bất kỳ hàm gl * nào được sử dụng, hàm initializeOpenGLFunctions(); phải được gọi, nếu không, lỗi thời gian chạy rất khó hiểu sẽ bật lên. tức là:

void GLWidget::initializeGL(){ 
    initializeOpenGLFunctions(); 
    glClearColor(1,0,0,1); 
} 

Hy vọng điều này cũng sẽ giúp người khác.

+0

cảm ơn. Nó đã giúp đỡ. vui lòng xem xét thêm nguồn tham chiếu. – Tauqir

+0

Rất vui khi được trợ giúp! Một tham chiếu sẽ là câu hỏi sau: http://stackoverflow.com/questions/31688370/qt-5-5-with-qmake-linker-cannot-resolve-opengl-function-calls - Từ đó tôi đã tò mò muốn xem các lớp được sử dụng, nhìn vào nguồn và cố gắng thử nhiều lần cho đến khi nó hoạt động. –

+1

phiên bản qt trước 5 đã bao gồm thư viện xuất khẩu cho opengl vào xây dựng, qt5 có trình bao bọc riêng được xây dựng bởi tính chính xác về nguyên tắc, vì vậy bạn gọi các phương thức lớp hoặc hàm bao thay vì hàm thư viện. có đức hạnh trong cả hai cách tiếp cận – Swift

Các vấn đề liên quan