树莓派交叉编译工具下载参见我前面博客,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放到和实验一同样的在树莓派上的位置。然后运行下可执行文件

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

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

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐