Step 1
假设嵌入式平台已经弄好了,什么boot,kernel,nfs都搭好了,开始准备开发。
1.安装交叉编译器,我使用的是板子提供商提供的交叉编译器。
cp /media/Upan/arm-linux-gcc -r ~/opt/
2.配置环境变量,在~/.bashrc中添加
export PATH=$PATH:/home/dashuage/opt/arm-linux-gcc/bin
3.source一下,在终端下执行
arm-linux-gcc --version
如果报错,找不到文件,有2个可能的原因:
- 未设置可执行权限,chmod +x arm-linxu-gcc 等程序
- 64位兼容32位程序问题,解决办法看这里
4.我觉得 arm-linux-gcc –version 有时候有点不太靠谱,helloworld才是正道。果然,出问题了
Error1
arm-linux-gnueabi-gcc error trying to exec ‘cc1plus’
在libexec中找到了这个程序,设置可执行权限。继续报错:
Error2
Assembler messages:
Fatal error: invalid –march= option `armv5te’
我感觉还是文件权限的问题,在交叉编译器文件目录下,找到了一个bin目录,里面有gcc g++ ld之类的程序,立刻设置可执行权限。继续报错:
Error3
../lib/libstdc++.so: file not recognized: File format not recognized
Collect2: error: ld returned 1 exit status
折腾了大半天,原来,libstdc++.so原本是个软连接,现在变成了data,用file命令查看的是data类型,所以readelf也读不出来,cat一下,发现,它果然是个软连接。好吧,那就重新ln一下吧。
我写了一个脚本,自动恢复当前目录下的软连接。
到这里,helloworld终于算是编译过去了。
Step 2
下载qt-everywhere源码,解压
Step 3
配置configure参数
./configure -v \
-prefix $PWD/_install \
-release \
-make libs \
-xplatform linux-arm-mydevice-g++ \
-optimized-qmake \
-pch \
-qt-sql-sqlite \
-qt-libjpeg \
-qt-zlib \
-no-sse2 \
-no-openssl \
-no-nis \
-no-cups \
-no-glib \
-no-c++11 \
-no-separate-debug-info \
-nomake examples -nomake tools \
--no-use-gold-linker -qt-sql-sqlite \
-confirm-license -qt-xcb -opensource \
-no-gtkstyle -qt-freetype \
-opengl es2 \
-egl \
-eglfs \
-linuxfb \
-no-directfb
顺便chmod +x一下
Step 4
添加板子的信息,在qt源码根目录下,执行
cp qtbase/mkspecs/linux-arm-gnueabi-g++ -r qtbase/mkspecs/linux-arm-mydevice-g++
修改qtbase/mkspecs/linux-arm-mydevice-g++/qmake.conf文件,把里面的编译器改成自己的交叉编译器。
Step 5
如果要编译EGL,需要做如下步骤:
1. 交叉编译的EGL, GLEv2, Mali(我的板子用的是mali),一般板子的厂商都会提供,把它们和交叉编译器放在一起就好了,后面需要用绝对路径指定这些库的includepath、libpath、lib。
2. 利用Qt源码提供的硬件配置文件,进行修改。找到和自己的板子最接近的那个
cp qtbase/mkspecs/devices/linux-arm-hisicon-hix*&^-g++ -r qtbase/mkspecs/devices/linux-arm-hisiv400-g++
- 修改linux-arm-hisiv400-g++中的qmake.conf,指定自己的EGL文件。
从这个文件里面,其实就是配置各种环境变量,这些环境变量就可以告诉Qt编译的时候,具体编译那个模块,需要到哪里去找头文件和库文件。如果后面配置的时候,发现没有找到,可以在这里面添加修改,有没有觉得很神奇?
注意,指定库文件的时候,大小写敏感。网上各种-lMali,折腾半天发现,我擦,我的是libmali.so, 需要-lmali。
Step 6
仔细看configure参数,可以发现,仅仅只有-xplatform linux-arm-mydevice-g++ 一项,是和硬件板子有关系的,而它只指向了Step4中的文件,没有指定Step5的文件。可以考虑Step 5配置文件里的环境变量写到Step 4的配置文件里去。
官方用的是-device -device-option;关于这两种的区别,我后续再来探究一下。
Step 7
在Qt源码根目录下,./config5-5-1.sh开始配置。
Step 8
观察configure清单,看到 egl下的mali opengl egl都是yes,好开森啊~~~
~未完待续~