发表者:admin分类:记录2020-02-26 14:19:09浏览:421次评论:0次,我来说两句

    使用QT作为嵌入式设备的人机界面交互平台,一旦选择了某款Linux主板,也就有了初步的运行环境基础,包括移植好的Linux版本,GUN交叉编译工具版本,C&C++库执行环境。QT环境在此基础上建立,编译好QT嵌入式版库文件。一切以能在嵌入式Linux板上能编译使用为主。很多时候,在宿主机上能使用的东西,去到嵌入式版本就遇到各种NG了。寻找答案煞费苦心。各种环境及工具版本是有关联搭配的。有时候为了能在低版本gcc环境下开发应用程序,不得不使用低版本的宿主机进行开发,扯远了。

    此处仅做个记录。现在QT4还是用的比较多的。然后通常嵌入式下会需要串口通信,官方提供有标准串口库,但是未包含在qt的安装包里,需另外编译安装。而且,据说串口库在高版本时只提供对QT5的支持了。这里我的宿主机(包括Window和Linux)与嵌入式版本的QT都使用QT4.8.6版本(Window版官方包名称:qt-opensource-windows-x86-mingw482-4.8.6-1.exe,Linux版是Ubuntu下通过apt安装的qt4.8.7),串口库使用5.4.2版(官方包名称:qtserialport-opensource-src-5.4.2)。

    在宿主机上,使用QCreator打开串口库文件夹根目录下的.pro文件,打开工程,在构建配置里,添加构建步骤,在make参数里,填入install。实际就是在编译结束后,执行make install操作进行安装。安装就是把编译好的库文件及需要的头文件拷贝到当前QT环境目录里去。

    在Window宿主机上,进行了如上设置后,执行构建,就顺利完成了。可以编译两种版本(Release和Debug),编译后的DLL文件其中Debug版的是带有d后缀的。

    在Linux宿主机上,同样操作,编译顺畅。但在执行到 make install 时会出现权限不足错误(Ubuntu普通状态下是不具有root权限,无法修改系统文件)。这时需要手动打开Shell使用sudo去执行以下 make install 操作。如果编译过程出现找不到libudev,需要使用sudo apt安装libudev-dev包。

    下面则还需要进行嵌入式版本的编译:

    编译的过程中,提示找不到libudev相关头文件。可能是当前交叉编译环境里没有libudev库。参考解决(在无libudev库下的编译):

    https://forum.qt.io/topic/50203/qtserialport-with-no-libudev

    大意是:

     在serialport-lib.pri文件里,有这个定义:


unix { packagesExist(libudev) { CONFIG += link_pkgconfig DEFINES += LINK_LIBUDEV PKGCONFIG += libudev }}


    把它屏蔽,则在编译时就不去链接 libudev 库,故而不会需要那些头文件了。不过并不是禁止 libudev 功能,而是变成在运行时去解析 libudev 了。

    如果要完全禁用 libudev 则需要修改 qserialportinfo_unix.cpp 文件:

QList QSerialPortInfo::availablePorts(){bool ok;QList serialPortInfoList; /// << COMMENTS OUT THIS#ifdef Q_OS_LINUX/// if (!ok) <<< AND COMMENTS OUT THISserialPortInfoList = availablePortsBySysfs(ok);#endifif (!ok) serialPortInfoList = availablePortsByFiltersOfDevices(ok);return serialPortInfoList;}


    同样,Linux下就是问题多,编译过程顺利(按前文所说屏蔽后),但安装过程会提示一些错误,仔细看下,都是arm-linux-gnueabihf-strip命令报错,大概是用了该命令去处理了不支持的格式文件。这个命令本来是用来对执行文件去掉里面的冗余信息的(比如调试信息),这里有很多处却用来处理一般的文本文件,肯定报错了。但非致命。谢天谢地还是编译安装完成了。这些错误应该不影响使用。

    最后,嵌入式Linux下的(交叉编译的)库文件要拷贝到目标板里库文件目录下。




Tags:

名字:

个人主页地址:

E-mail:

评论列表