【学QT】2 - QT/E环境的建立

本文详细介绍如何搭建Arm-Linux嵌入式QT/E3.x环境,包括下载、配置、编译步骤及常见问题解决方案。适合希望快速入门QT/E3.x系列的开发者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


Arm-Linux嵌入式QT/E环境的建立(qt/e 3.x系列)


         QT/E 3.x系列比QT/E 2.x系列有非常大的改进,大大提高了开发进度,不再使用tmake,安装也更简单。但目前在网上关于QT/E 3.x系列的介绍还是比较少,所以本文介绍一下QT/E 3.x系列的安装。


二、编译QT


   1、QT/E自由版可到官网ftp下载。网址是:ftp://ftp.trolltech.com/qt/source/ 。可自己选择一个版本下载,个人认为QT/E 3.x系列比较好用,不过QT/E 2.x系列在网上的资料比较多。但建议不用qt/e 3.3.x 的版本,因为在本人开发的过程当中试用过qt/e 3.3.4和qt/e3.3.8,发现它们在ARM开发板上占CPU的资源特高,一直占cpu 98%左右,现在我还没找到原因,不知道有没有哪位朋友也遇到这个问题。推荐用qt/e 3.1.0版本,我正在用,没遇到什么问题。


(注:问题已经得到解决,原来是键盘接口没做好,等有空与大家分享一下移植键盘接口的过程)


         2、在这里,本人假设用的是 qt-embedded-free-3.3.8b.tar.gz


         3、把文件qt-embedded-free-3.3.8.tar.gz 拷贝到一个文件夹,这里我用:/usr/local/arm这个目录。注意后面建立环境变量时要与之对应。


         4、解压 tar   zxvf   qt-embedded-free-3.1.0.tar.bz2  


             把解压后的文件夹qt-embedded-free-3.3.8b改为qte。(可以不改,这里是为了方便,注意后面建立环境变量时要与之对应)    


                        mv     qt-embedded-free-3.3.8b     qte


         5、建立环境变量


                       vi     ~/.bashrc


               在后面加上


                       export QTDIR=/usr/local/arm/qte
                       export QTEDIR=$QTDIR
                       export PATH=$QTDIR/bin:$PATH
                       export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH


              (请重新登陆,以使得环境变量生效)
                 









==============================================================
注意:将/usr/local/qt/bin下的“uic,moc“拷贝到/urc/local/arm/qte/bin文件夹下。
==============================================================


6、修改文件


1)打开src/tools/qglobal.h查看318-326行:
# if (defined(__arm__) || defined(__ARMEL__)) && !defined(QT_MOC_CPP)
# define Q_PACKED __attribute__ ((packed))
# if __GNUC__ == 3 && __GNUC_MINOR__ >= 4
# define Q_NO_PACKED_REFERENCE
# endif
# endif
# if !defined(__EXCEPTIONS)
# define Q_NO_EXCEPTIONS
# endif


修改为:
# if (defined(__arm__) || defined(__ARMEL__)) && !defined(QT_MOC_CPP)
# define Q_PACKED __attribute__ ((packed))
# if __GNUC__ == 3 && __GNUC_MINOR__ >= 4
# define Q_NO_PACKED_REFERENCE
# endif
# if __GNUC__ == 4 && __GNUC_MINOR__ >= 0            
# define Q_NO_PACKED_POINTERS
# endif
# endif
# if !defined(__EXCEPTIONS)
# define Q_NO_EXCEPTIONS
# endif


2)打开include/qstring.h查看195-199行
ushort unicode() const { return ucs; }
#ifdef Q_NO_PACKED_REFERENCE
ushort &unicode() { return *(&ucs); }
#else
ushort &unicode() { return ucs; }
#endif


修改为:
ushort unicode() const { return ucs; }
#ifdef Q_NO_PACKED_REFERENCE
ushort &unicode() { return *(&ucs); }
#elif defined Q_NO_PACKED_POINTERS
ushort &unicode() { ushort& tmp = ucs; return tmp; }
#else
ushort &unicode() { return ucs; }
#endif




          7、配置QT


            进入QT/E目录:     cd    $QTDIR


              输入:   ./configure  -embedded  arm   -thread  -no-cups -qvfb -depths 4,8,16,32




            上述选项: -embedded  arm 指目标平台为arm; -thread 表示支持qt线程,本人开发当中用到; -qvfb 表示支持虚拟缓冲帧工具qvfb;-depths 4,8,16,32 表示支持4,8,16,32 位的显示颜色深度。还有很多选项就不一一列举,请查看 ./configure  -help。


         此外还有一个选项我没用的是 -qconfig  local,你可以把一些开关变量写到一个文件qconfig-local.h 中,并把它放到$QTDIR/src/tools下。可参考这个目录下的qconfig-small.h、qconfig-medium.h 、qconfig-large.h等文件,直接使用它们也行,如:  -qconfig  small 。通过这些开关变量,可以把一些开发当中用不着的构件去掉,减少qt库的大小。这里要对QT比较熟练,初学者可先不理。




            (本人在家里编译到这里曾出现编译 $QTDIR/include/qvaluestack.h 这个文件的时候出错,后来把qt3.3.8对应的文件拷贝过来覆盖便通过了,估计是与gcc的版本不兼容的问题,我在公司里没出现过这种问题)


         8、编译


            make sub-src      // 指定按精简方式编译开发包,也就是说有些Qt 类未被编
译。


          9、测试


                  至此编译工作完成,最后测试一下是否能正常使用。我们可以用QT自带的例子来测试,如:


                  cd  $QTDIR/examples/aclock      //或你自己新建一个QT工程也行


                  make clean                              //把原来的清掉


                   rm    *.pro      Makefile                       //删掉,重新建立工程文件


                   qmake   -project


                    qmake   -spec  $QTDIR/mkspecs/qws/linux-arm-g++   -o  Makefile           


                -spec指定目标板的配置文件,这里我做的是linux arm平台,注意在这里,$QTDIR/mkspecs/qws/linux-arm-g++ 它不是编译器,是一个配置文件,而编译时用的编译器是我们在第一步建立的arm交叉编译工具链里面的编译器。 


                   make                      


             如果没出错就表示你的QT/E环境已经成功建立。如果提示说cannot   find   -lqte,那么你试一下修改Makefile文件,找到-lqte ,把它改为-lqte-mt再make一次一般就行了。这是因为如果用到QT线程或其它一些原因,它生成的库不再是libqte.so.3.1.0,而是 libqte-mt.so.3.1.0,所以它便找不到了。


三、移植到开发板(以下都是在目标机环境下)


        1、新建一个目录,如:/qt/lib。进入此目录 cd   /qt/lib


        2、通过 ftp  把上面生成的qt库文件libqte-mt.so.3.1.0下载到开发板/qt/lib/目录下。(注意:不要用wget 下载,会破坏库文件,从而出现  ld.so: dynamic-link.h: 62: elf_get_dynamic_info: Assertion `! "bad dynamic tag"'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' failed!.这种错误)


        3、创建qt库连接:


                ln   -s   libqte-mt.so.3.3.8     libqte-mt.so


                ln   -s   libqte-mt.so.3.3.8     libqte-mt.so.3


                ln   -s   libqte-mt.so.3.3.8     libqte-mt.so.3.1


        4、建立环境变量


                       vi     ~/.bashrc


               在后面加上


                       export QTDIR=/qt
                       export QTEDIR=$QTDIR
                       export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
          (当移植到开发板上的时候可以直接将上面三段加到 /etc/init.d/rcS下,即直接作为运行脚本处理,也要注意上边三个qt库的位置,要和输出指向相同)


           5、到此目标板的环境已经建好。现在可以把上面的例子aclock下载到目标板上试一下能不能跑起来!


             在开发板控制台下输入:  ./aclock  -qws 


              如果能跑起来但是键盘用不了,那是正常的情况,因为键盘、鼠标等设备的接口还没加进QT/E的原因,而这个不是一两句话能说清的,所以留到以后再另外补充!


补充一点:如果有类似这样的提示:  "./aclock: error while loading shared libraries: libstdc++.so.6: cannot load shared object file: No such file or directory." 你可以从我们第一步建立的arm交叉编译工具链里的/usr/local/arm/2.95.3/arm-linux/lib/目录下找到相应的库文件下载到开发板的 /lib 目录下即可。

转载于:https://www.cnblogs.com/roger0212/p/4436671.html

× Preparing metadata (pyproject.toml) did not run successfully. │ exit code: 1 ╰─> [28 lines of output] pyproject.toml: line 7: using '[tool.sip.metadata]' to specify the project metadata is deprecated and will be removed in SIP v7.0.0, use '[project]' instead Querying qmake about your Qt installation... Traceback (most recent call last): File "/home/orangepi/Usr/pyqt/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 389, in <module> main() File "/home/orangepi/Usr/pyqt/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 373, in main json_out["return_val"] = hook(**hook_input["kwargs"]) File "/home/orangepi/Usr/pyqt/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 178, in prepare_metadata_for_build_wheel whl_basename = backend.build_wheel(metadata_directory, config_settings) File "/tmp/pip-build-env-33itomml/overlay/lib/python3.10/site-packages/sipbuild/api.py", line 28, in build_wheel project = AbstractProject.bootstrap('wheel', File "/tmp/pip-build-env-33itomml/overlay/lib/python3.10/site-packages/sipbuild/abstract_project.py", line 74, in bootstrap project.setup(pyproject, tool, tool_description) File "/tmp/pip-build-env-33itomml/overlay/lib/python3.10/site-packages/sipbuild/project.py", line 629, in setup self.apply_user_defaults(tool) File "/tmp/pip-install-a0rb2xwl/pyqt6_69c08c23e345445f85c3819acd773d64/project.py", line 65, in apply_user_defaults super().apply_user_defaults(tool) File "/tmp/pip-build-env-33itomml/overlay/lib/python3.10/site-packages/pyqtbuild/project.py", line 51, in apply_user_defaults super().apply_user_defaults(tool) File "/tmp/pip-build-env-33itomml/overlay/lib/python3.10/site-packages/sipbuild/project.py", line 243, in apply_user_defaults self.builder.apply_user_defaults(tool) File "/tmp/pip-build-env-33itomml/overlay/lib/python3.10/site-packages/pyqtbuild/builder.py", line 58, in apply_user_defaults self._get_qt_configuration() File "/tmp/pip-build-env-33itomml/overlay/lib/python3.10/site-packages/pyqtbuild/builder.py", line 483, in _get_qt_configuration for line in project.read_command_pipe([self.qmake, '-query']): File "/tmp/pip-build-env-33itomml/overlay/lib/python3.10/site-packages/sipbuild/project.py", line 596, in read_command_pipe raise UserException( sipbuild.exceptions.UserException
最新发布
04-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值