如何使用 OpenGL 交叉编译 UnixBench?

Posted

技术标签:

【中文标题】如何使用 OpenGL 交叉编译 UnixBench?【英文标题】:How to cross compile UnixBench with OpenGL? 【发布时间】:2017-04-25 03:11:01 【问题描述】:

我成功地将没有GRAPHIC_TESTSUnixBench 安装到iMX6 Yocto 中。 Previous question.

当我尝试启用GRAPHIC_TESTS 时,我收到了这个错误:

fatal error: GL/gl.h: No such file or directory

所以我将 opengl 包含路径添加到 Makefile 中,如下所示:

CFLAGS = \
 -I/opt/poky/1.6.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/usr/include \
 -march=armv7-a -mtune=cortex-a9

freescale iMX6 yocto 貌似不支持OpenGL。所以改变了这个:

# GL_LIBS = -lGL -lXext -lX11
# to this ↓ 
GL_LIBS = -lGLESv2 -lEGL -lGAL -lXext -lX11

并更改源代码:

//#include <GL/gl.h>
//#include <GL/glx.h>
// to this ↓
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>

然后我得到一个新的错误:

    src/ubgears.c: In function 'gear':
src/ubgears.c:163:17: error: 'GL_FLAT' undeclared (first use in this function)
    glShadeModel(GL_FLAT);
                 ^
src/ubgears.c:163:17: note: each undeclared identifier is reported only once for each function it appears in
src/ubgears.c:168:12: error: 'GL_QUAD_STRIP' undeclared (first use in this function)
    glBegin(GL_QUAD_STRIP);
            ^
src/ubgears.c:182:12: error: 'GL_QUADS' undeclared (first use in this function)
    glBegin(GL_QUADS);
            ^
src/ubgears.c:267:17: error: 'GL_SMOOTH' undeclared (first use in this function)
    glShadeModel(GL_SMOOTH);
                 ^
src/ubgears.c: In function 'reshape':
src/ubgears.c:320:17: error: 'GL_PROJECTION' undeclared (first use in this function)
    glMatrixMode(GL_PROJECTION);
                 ^
src/ubgears.c:327:17: error: 'GL_MODELVIEW' undeclared (first use in this function)
    glMatrixMode(GL_MODELVIEW);
                 ^
src/ubgears.c: In function 'init':
src/ubgears.c:341:14: error: 'GL_LIGHT0' undeclared (first use in this function)
    glLightfv(GL_LIGHT0, GL_POSITION, pos);
              ^
src/ubgears.c:341:25: error: 'GL_POSITION' undeclared (first use in this function)
    glLightfv(GL_LIGHT0, GL_POSITION, pos);
                         ^
src/ubgears.c:343:13: error: 'GL_LIGHTING' undeclared (first use in this function)
    glEnable(GL_LIGHTING);
             ^
src/ubgears.c:349:21: error: 'GL_COMPILE' undeclared (first use in this function)
    glNewList(gear1, GL_COMPILE);
                     ^
src/ubgears.c:350:27: error: 'GL_AMBIENT_AND_DIFFUSE' undeclared (first use in this function)
    glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red);
                           ^
src/ubgears.c:366:13: error: 'GL_NORMALIZE' undeclared (first use in this function)
    glEnable(GL_NORMALIZE);
             ^
src/ubgears.c: At top level:
src/ubgears.c:378:30: error: unknown type name 'GLXContext'
              Window *winRet, GLXContext *ctxRet)
                              ^
src/ubgears.c: In function 'main':
src/ubgears.c:561:4: error: unknown type name 'GLXContext'

此代码可能仅用于 OpenGL 而不是 OpenGLES。

如果有人对此有任何想法,请分享。

更新:

Yocto 中有glxgears -info,我查看here 中的源代码。它是由 OpenGL 而不是 OpenGL ES 编写的! iMX6 应该只支持 OpenGL ES。这个怎么运作?

解决方案: 这是我的错误。我指出了错误的 OpenGL 库和头文件。

# GL_LIBS = -lGL -lXext -lX11
# to this ↓ 
GL_LIBS = -lXext -lX11 /work/fsl-release-bsp/build-x11/tmp/sysroots/imx6qsabresd/usr/lib/libGL.so

【问题讨论】:

【参考方案1】:

看起来您正在尝试为 OpenGL ES 平台编译 OpenGL 代码;两者不兼容,所以这是行不通的。

【讨论】:

freescale iMX6 GPU 仅支持 OpenGL ES,那么有没有关于将 OpenGL 转换为 OpenGL ES 的文档? 无文档 - 这不是一个简单的转换(OpenGL 中的很多功能在 OpenGL ES 中根本不存在,尤其是 2.0 及更高版本,它删除了固定的函数路径)。根据使用的函数,您的代码确实使用了固定的函数逻辑,所以我将开始查看 OpenGL ES 1.1,而不是 2.0。 此外,您不仅需要修复代码,还可能需要更改模型数据。看起来您的代码正在使用 GL ES 中不存在的 GL_QUADS (及相关);您需要对模型进行三角测量并使用 GL_TRIANGLES。 最后我找到了 OpenGL 库并使用 OpenGL 而不是 OpenGL ES 编译源代码。感谢您的回答。

以上是关于如何使用 OpenGL 交叉编译 UnixBench?的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL中的交叉淡入淡出场景

Linux aarch64交叉编译之glm数学库

如何交叉编译 动态库

Hi3516开发笔记:Hi3516虚拟机交叉开发环境搭建之交叉编译Qt

(转载)(官方)UE4--图像编程----着色器开发----HLSL 交叉编译器

如何Ubuntu配置多个交叉编译工具??