c++ - Qt OpenGL 部分函数 在Windows下报错:undefined reference xxx
黄舟
黄舟 2017-04-17 13:59:30
0
3
781

这个问题仅在Windows下存在,在Linux和OSX下面是可以正常编译和运行的。

问题出在如下函数:

void GLWidget::drawBackground(QPainter *, const QRectF &)
{
    glClearColor(0, 0, 102 / 255, 1);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glMatrixMode(GL_PROJECTION);
    glPushMatrix();
    glLoadIdentity();

    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
    glLoadIdentity();

    glColor3f(0, 0, 0);
    glLineWidth(2);

    float margin = 0.05;
    float l = margin, r = 1 - margin, b = margin, t = 1 - margin;
    int splitNum = 9;
    float dx =(1 - margin * 2) / (splitNum + 1);

    glBegin(GL_LINE_LOOP);
        glVertex2f(l, b);
        glVertex2f(l, t);
        glVertex2f(r, t);
        glVertex2f(r, b);
    glEnd();

    glBegin(GL_LINES);
    for(int i = 1; i <= splitNum; i++)
    {
        glVertex2f(l, b + dx * i);
        glVertex2f(r, b + dx * i);
        glVertex2f(l + dx * i, b);
        glVertex2f(l + dx * i, t);
    }
    glEnd();
    glPopMatrix();

    glMatrixMode(GL_PROJECTION);
    glPopMatrix();
}

以及(这个是加载obj3D模型用的)

void Model::render(bool wireframe, bool normals) const 
{ 
    glEnable(GL_DEPTH_TEST); 
    glEnableClientState(GL_VERTEX_ARRAY); 
    if (wireframe) { 
        glVertexPointer(3, GL_FLOAT, 0, (float *)m_points.data()); 
        glDrawElements(GL_LINES, m_edgeIndices.size(), GL_UNSIGNED_INT, m_edgeIndices.data()); 
    } else { 
        glEnable(GL_LIGHTING); 
        glEnable(GL_LIGHT0); 
        glEnable(GL_COLOR_MATERIAL); 
        glShadeModel(GL_SMOOTH);

        glEnableClientState(GL_NORMAL_ARRAY); 
        glVertexPointer(3, GL_FLOAT, 0, (float *)m_points.data()); 
        glNormalPointer(GL_FLOAT, 0, (float *)m_normals.data()); 
        glDrawElements(GL_TRIANGLES, m_pointIndices.size(), GL_UNSIGNED_INT, m_pointIndices.data());

        glDisableClientState(GL_NORMAL_ARRAY); 
        glDisable(GL_COLOR_MATERIAL); 
        glDisable(GL_LIGHT0); 
        glDisable(GL_LIGHTING); 
    }

    if (normals) { 
        QVector<Point3d> normals; 
        for (int i = 0; i < m_normals.size(); ++i) 
            normals << m_points.at(i) << (m_points.at(i) + m_normals.at(i) * 0.02f); 
        glVertexPointer(3, GL_FLOAT, 0, (float *)normals.data()); 
        glDrawArrays(GL_LINES, 0, normals.size()); 
    } 
    glDisableClientState(GL_VERTEX_ARRAY); 
    glDisable(GL_DEPTH_TEST); 
}

在Windows下面会出现一堆undefined reference的错误,但在Linux和OSX下面却能正常编译和运行,是Windows需要装哪个依赖包吗?
使用的是Qt5自带OpenGL库,Qt5.6 MinGW 32Bit。

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回覆(3)
阿神

已解決,參考Qt5 Docs Windows系統需求

需要特定OpenGL 實現的應用程式(例如,桌面OpenGL 由於依賴OpenGL 3.0 或更高版本提供的功能)應在實例化QGuiApplication 或QApplication 之前設定應用程式屬性Qt::AA_UseOpenGLES 或Qt:: AA_UseDesktopOpenGL 。設定這些屬性後,不會考慮其他 OpenGL 實作。此外,如果他們願意,此類應用程式可以透過將opengl32.lib 添加到其.pro 專案檔案中來自由地進行直接OpenGL 函數呼叫:LIBS += opengl32.lib (Visual Studio) 或LIBS += -lopengl32 (MinGW) ). 從應用程式的角度來看,結果相當於Qt 的-opengl 桌面建置配置。

在專案的.pro檔案中新增:

雷雷

編譯成功。

阿神

如果引用路徑都沒錯的話,可以考慮下圖形驅動的問題。好像Windows下Qt的gl庫裡面某些API是基於DX11(9)實現的,裝下DX的SDK試試

阿神

貼出錯的圖片吧

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板