QGLViewer从配置到放弃

QGLViewer从配置到放弃

五月 24, 2021

折腾了一周,因为之前也没用过 Qt 所以需要学的还挺多的。折腾来折腾去结果是老师下定论这玩意儿在 ARM 架构上不好搞,跟客户商量放弃了。(但我在 mac 上也没搞好啊啊啊)不过过程还是学到了一些的,不能白费一周。

Ubuntu

老师的 Nvidia agx,ARM 架构,Ubuntu 18.04,Qt 5.9.5。

照着官网教程配置,有个注意的点是整个文件要在 Linux 下解压。

打开正确文件夹 QGLViewer,刚开始用 Qt 直接 build all 报错了,还找不到详细报错信息,就去用命令行。结果是 example 都在报错,后来看报错信息,找不到 .so 动态库,怀疑是没装 OpenGL。

然后就去安装 OpenGL,教程【1】【2

安装了 gl 再去试试,搞了个demo,果然是qt的问题。

解决:Linux下安装QT和OpenGL后QT无法使用OpenGL的解决方法,在 .pro 文件里加

1
LIBS = -lGL -lGLU -lglut

然后还是报错,说 libQGLViewer-qt5.so 里面啥函数都找不到,(结果这里走了点弯路)

然后就去寻找.so文件

1
2
3
sudo apt-get install apt-file
apt-file update //这里不行就 sudo,我还怕出问题先去问了老师没问题才执行的orz
apt-file search libXX.so

但是找不到,啥返回都没有。结果去补 linux 编译流程动态链接库了。//这篇良心啊。

然后看报错去找了DSO missing from command line QT,(这里就是自己的问题了)但还是报错,后来才明白是自己写的不对,那个lName,应该是 lGL.so。

然后找到了这个,原来是ubuntu把opengl的库放到 /usr/lib/aarch64-linux-gnu/ 里了,一个解决办法是建立链接

1
2
3
sudo ln -s /usr/lib/aarch64-linux-gnu/libGL.so.1 /usr/lib/libGL.so
sudo ln -s /usr/lib/aarch64-linux-gnu/libGLU.so.1 /usr/lib/libGLU.so
sudo ln -s /usr/lib/aarch64-linux-gnu/libglut.so.3 /usr/lib/libglut.so

然后在上级.pro文件中加

1
LIBS = -lGL -lGLU -lglut

就可以了。突然感觉按照之前QGLViewer说的加个那啥路径估计也行而且更方便。不过没去再找。

然鹅现在虽然不报错了,但是跑出来的窗口一片黑,用 Qt 跑简单的带 GL 的 demo 也是黑窗,普通 gl 直接命令行编译的 demo 是可以的,普通 qt 的 Qwidget demo 也是可以的,说明是 qgl 的问题?(因为没解决所以我也不知道到底是不是orz)

查来查去看这个的评论怀疑是 opengl 和 qt 的版本问题,去看 OpenGL 的信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
nvidia@nvidia-desktop:~$ glxinfo | grep 'version'

server glx version string: 1.4
client glx version string: 1.4
GLX version: 1.4
OpenGL core profile version string: 4.6.0 NVIDIA 32.1.0
OpenGL core profile shading language version string: 4.60 NVIDIA
OpenGL version string: 4.6.0 NVIDIA 32.1.0
OpenGL shading language version string: 4.60 NVIDIA
OpenGL ES profile version string: OpenGL ES 3.2 NVIDIA 32.1.0
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.20
GL_EXT_shader_group_vote, GL_EXT_shader_implicit_conversions,

nvidia@nvidia-desktop:~$ qmake -v
QMake version 3.1
Using Qt version 5.9.5 in /usr/lib/aarch64-linux-gnu

这个里面有说怎么设置和查看使用版本的方法。这个也有说。

1
2
3
// Get Version Information
glType = (context()->isOpenGLES()) ? "OpenGL ES" : "OpenGL";
glVersion = reinterpret_cast<const char*>(glGetString(GL_VERSION));
1
2
3
4
5
6
7
8
9
// 设置 OpenGL 版本信息
// 注意: format 必须在 show() 调用前设置
QSurfaceFormat format;
format.setRenderableType(QSurfaceFormat::OpenGL);
format.setProfile(QSurfaceFormat::CoreProfile);
format.setVersion(4,3);
MyOpenGLWidget w;
w.setFormat(format);
w.show();

输出的版本是

1
OpenGL ES OpenGL ES 3.2 NVIDIA 32.1.0 ( NoProfile )

去查 OpenGL ES 是怎么回事,说 OpenGL for Embedded Systems, 是 OpenGL 嵌入式设备版。

有个报错是这样,

1
QEGLPlatformContext: Failed to create context: 3009

官网有这样的反馈但是他大概是旧版本问题感觉不是我的问题。我都傻了,是QEGL的问题?我甚至开始怀疑是 gpu 没驱动或者版本问题,跑

1
nvidia-smi

就报的这个linux服务器上查看显卡(nvidia)型号里面说的报错,我甚至去看了Ubuntu系统下安装NVIDIA驱动OpenGL与显卡驱动orz

后来问老师,老师说不可能这显卡刷机都自带的驱动,然后老师上手去搞了一天,得出结论

不用libQGLViewer这个库了 咱们直接调QT提供的openGL API

绝了,真就从配置到放弃。

Mac

这个库也有问题,不过看报错大概是没跟上 SDK ,designer也是。Bug sur,不愧是你。

1
:-1: error: Project ERROR: Could not resolve SDK SDKVersion for 'macosx10.15' using --show-sdk-version

又是一个反馈。反正我也不用它了。

还有个mac上qmake路径配置。不用这个库 Qt 自己的 GL 库在 mac 上都没问题。