Ubuntu下使用树莓派交叉编译工具编译QT(带OpenGL)及在树莓派上进行验证
主要是为了解决前面博客最后图片不能显示问题,所以博主决定沉下心来先把一些基础知识重新整理下,所以才有了前面三篇博客:Ubuntu下的基本知识点(一)_jiugeshao的专栏-CSDN博客Ubuntu下的基本知识点(二)_jiugeshao的专栏-CSDN博客Ubuntu下源码编译OpenCV静态库及使用(勾选WITH_QT)_jiugeshao的专栏-CSDN博客在此基础上,博主继续做了多次尝试
树莓派交叉编译工具下载参见我前面博客,qt源码这里用的是qt-everywhere-opensource-src-5.5.1版本。注意选择下面这个版本

两个文件夹所在博主电脑上路径如下图中的标记红框。

可以cd到如下目录下去,可以看到里面有很多目标平台,接下来会用到linux-arm-gnueabi-g++平台

cd到该文件夹里面

由于后面会选择树莓派交叉编译工具里的arm-linux-gnueabihf-g++和arm-linux-gnueabihf-gcc 作为编译c++和c的工具,所以我们需要在qmake.conf中选中它,
注意root用户模式下在的~/.bashrc文件中添加此环境变量


添加完毕,生效后(source ~/.bashrc),在终端输入arm后跟两个tab键后,会出现如下信息,表示已经正确配置

回到上面的qmake.conf文件,打开修改其为如下:
#
# qmake configuration for building with arm-linux-gnueabi-g++
#
MAKEFILE_GENERATOR = UNIX
CONFIG += incremental
QMAKE_INCREMENTAL_STYLE = sublib
include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)
# modifications to g++.conf
QMAKE_CC = arm-linux-gnueabihf-gcc
QMAKE_CXX = arm-linux-gnueabihf-g++
QMAKE_LINK = arm-linux-gnueabihf-g++
QMAKE_LINK_SHLIB = arm-linux-gnueabihf-g++
# modifications to linux.conf
QMAKE_AR = arm-linux-gnueabihf-ar cqs
QMAKE_OBJCOPY = arm-linux-gnueabihf-objcopy
QMAKE_NM = arm-linux-gnueabihf-nm -P
QMAKE_STRIP = arm-linux-gnueabihf-strip
load(qt_config)
在前面的qt-everywhere-opensource-src-5.5.1文件夹下新建两个文件夹,名字随意定,这里取名为build和install

为什么要在root权限下,是因为博主在普通权限下,在make(已经是sudo make去执行)中,会报不识别编译器arm-linux-gnueabihf-gcc的问题。
终端cd到crossbuild目录下,执行如下命令
../configure -prefix /home/sxhlvye/qt-everywhere-opensource-src-5.5.1/install -opensource -confirm-license -xplatform linux-arm-gnueabi-g++
最后的时候会出现报错:
ERROR: The OpenGL functionality tests failed!
You might need to modify the include and library search paths by editing QMAKE_INCDIR_OPENGL[_ES2],
QMAKE_LIBDIR_OPENGL[_ES2] and QMAKE_LIBS_OPENGL[_ES2] in the mkspec for your platform.
在Stack Overflow上也找寻了一些解法,但并不能解决此问题。
c++ - Compiling Qt on Linux Mint - The OpenGL functionality test failed - Stack Overflow
这里博主在上文提到的qmake.conf文件中,配置了上面报错中提到的Opengl的路径。这里的opengl库,博主在前面一篇博客中已经交叉编译好,直接拿来用就可以。于是博主重新修改了上面的qmake.conf文件,如下:
#
# qmake configuration for building with arm-linux-gnueabi-g++
#
MAKEFILE_GENERATOR = UNIX
CONFIG += incremental
QMAKE_INCREMENTAL_STYLE = sublib
include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)
QMAKE_INCDIR_OPENGL_ES2 = /home/sxhlvye/mesa-12.0.5/install/include
QMAKE_LIBDIR_OPENGL_ES2 = /home/sxhlvye/mesa-12.0.5/install/lib
QMAKE_LIBS_OPENGL_ES2 = -lglapi -lGLESv2
# modifications to g++.conf
QMAKE_CC = arm-linux-gnueabihf-gcc
QMAKE_CXX = arm-linux-gnueabihf-g++
QMAKE_LINK = arm-linux-gnueabihf-g++
QMAKE_LINK_SHLIB = arm-linux-gnueabihf-g++
# modifications to linux.conf
QMAKE_AR = arm-linux-gnueabihf-ar cqs
QMAKE_OBJCOPY = arm-linux-gnueabihf-objcopy
QMAKE_NM = arm-linux-gnueabihf-nm -P
QMAKE_STRIP = arm-linux-gnueabihf-strip
load(qt_config)
完毕后,执行如下命令:(注意加了一个-verbose选项,这个选项有助于show出更多的信息,方便排查问题)
../configure -prefix /home/sxhlvye/qt-everywhere-opensource-src-5.5.1/install -opensource -confirm-license -release -xplatform linux-arm-gnueabi-g++ -opengl es2 -no-c++11 -nomake examples -nomake tools -force-pkg-config -verbose
出现了如下报错信息:
/home/sxhlvye/mesa-12.0.5/install/include/GLES2/gl2platform.h:20:29: fatal error: KHR/khrplatform.h: No such file or directory
#include <KHR/khrplatform.h>
^
compilation terminated.
make: *** [Makefile:195: opengles2.o] Error 1
OpenGL ES 2.0 disabled.
The OpenGL ES 2.0 functionality test failed!
You might need to modify the include and library search paths by editing
QMAKE_INCDIR_OPENGL_ES2, QMAKE_LIBDIR_OPENGL_ES2 and QMAKE_LIBS_OPENGL_ES2 in
/home/sxhlvye/qt-everywhere-opensource-src-5.5.1/qtbase/mkspecs/linux-arm-gnueabi-g++.
从上面可以看到,缺少一个KHR/khrplatform.h文件,博主发现前面博客所编译的源码mesa-12.0.5中含有上面的文件。于是执行如下的命令语句(增加了如上文件的路径选项)
../configure -prefix /home/sxhlvye/qt-everywhere-opensource-src-5.5.1/install -opensource -confirm-license -release -xplatform linux-arm-gnueabi-g++ -opengl es2 -nomake examples -nomake tools -force-pkg-config -verbose -I/home/sxhlvye/mesa-12.0.5/include -skip qtwayland -skip qtlocation -skip qtscript -skip qt3d -make libs
成功后可以看到输出的log日志中确实含有了opengl的功能

然后再执行make -j4 和make install。成功配置完毕。

验证其有效性:
树莓派相关博客见博主前面博客
实验1:
参考我之前的博客,用这个交叉编译的qmake去编译下含有qt功能的cpp文件。环境配置参考其,这里还是贴出我的./bashrc文件的环境变量(只和qt配置相关的环境变量,可以看到和之前博客不大)

cpp文件中的代码不变,同之前博客。唯一的区分就是这边会用前面刚交叉编译的qmake去编译。而之前的博客就是用本地的qmake去编译。
#include <QtWidgets/QApplication>
#include <QtWidgets/QLabel>
int main(int argc,char **argv)
{
QApplication a(argc,argv);
QLabel label(QLabel::tr("Helle Qt!"));
label.show();
return a.exec();
}
编译所用语句同前面博客一样。这边不再赘叙。最后可以获得如下的文件

接下来尝试将生成的tests_qt执行文件拷贝到树莓派上,看其能否正常运行。
这里我拷贝了两个文件夹,第一个就是上面的test_qt文件夹。第二个是前面刚交叉编译qt所安装的目录install文件夹。

这两个文件夹在树莓派上的放置位置如下图所示:

root权限下~./bashr文件夹的环境变量设置为如下:

此时在终端输入./test_qt ,运行在ubuntu上编译得到的可执行文件。注意需要用chmod命令设置下权限。

可以看到程序正常运行,带Hello Qt!的界面也show出来了

实验2(验证opengl的有效性):
这里我在test_qt文件夹中创建了三份文件,分别为widget.h , widget.cpp, main.cpp。
widget.h中的代码如下:
#ifndef WIDGET_H
#define WIDGET_H
#include <QOpenGLWidget>
#include <QOpenGLFunctions>
class Widget : public QOpenGLWidget, protected QOpenGLFunctions
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
public:
void initializeGL() override;
void resizeGL(int w, int h) override;
void paintGL() override;
};
#endif // WIDGET_H
widget.cpp中的代码如下:
#include "widget.h"
Widget::Widget(QWidget *parent)
: QOpenGLWidget(parent)
{
}
Widget::~Widget()
{
}
void Widget::initializeGL()
{
this->initializeOpenGLFunctions(); //为当前上下文初始化提供OpenGL函数解析
}
void Widget::resizeGL(int w, int h)
{
glViewport(0.0f,0.0f,w,h); //调整视口
}
void Widget::paintGL()
{
glClearColor(0.2f, 0.3f, 0.3f, 1.0f); //清屏
glClear(GL_COLOR_BUFFER_BIT); //清除颜色缓冲
}
main.cpp中的代码如下:
#include <QApplication>
#include <widget.h>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
Widget window;
window.resizeGL(800,600);
window.show();
return app.exec();
}
先cd到test_qt目录下,执行qmake -project命令,然后修改生成的test_qt.pro文件如下:
######################################################################
# Automatically generated by qmake (3.0) ?? 12? 29 21:31:23 2021
######################################################################
QT += widgets
TEMPLATE = app
TARGET = test_qt
INCLUDEPATH += . \
/home/sxhlvye/mesa-12.0.5/include
LIBS += /home/sxhlvye/libdrm-2.4.100/install/lib/libdrm.so.2 \
/home/sxhlvye/mesa-12.0.5/install/lib/libGLESv2.so
# Input
HEADERS += widget.h
SOURCES += main.cpp widget.cpp
上面的libdrm.so.2及libGLESv2.so文件都是我前面博客树莓派Tools交叉编译OpenGL(mesa-12.0.5)_jiugeshao的专栏-CSDN博客交叉编译得到的。博主这边直接拿来用即可。
完毕后执行命令qmake test_qt.pro
再执行命令make
此时test_qt文件夹内生成如下的文件

只需要把此test_qt放到和实验一同样的在树莓派上的位置。然后运行下可执行文件

出现了如下界面,运行成功

到此验证结束,也验证了上面交叉编译的成功。
更多推荐


所有评论(0)