解压并进入Qt目录:
tar –zxvf qt-embedded-linux-opensource-src-4.5.3.tar.gz
cd qt-embedded-linux-opensource-src-4.5.3
注意:不能修改解压后的qt目录名,否则无法编译通过,提示的错误信息不确定。
1. 编译qt工具
在交叉编译qt库的过程中,需要用到qt提供的工具,包括moc、uic、rcc等。这些工具是在编译主机上运行的,如果我们一开始就直接交叉编译,那么编译出来的这些工具是目标体系的,当在主机需要使用这些工具的时候无法运行,提示出错:
-bash ../bin/moc: cannot execute binary file
所以需要对这些工具进行单独编译(非交叉),在Qt目录下运行:
./configure #配置
cd src/tools/bootstrap #进入工具目录
./../../bin/qmake –unix #生成Makefile
make #编译
cd ../moc #进入moc工具目录
./../../bin/qmake –unix #生成Makefile
make #编译
cd ../rcc #进入rcc工具目录
./../../bin/qmake –unix #生成Makefile
make #编译
cd ../uic #进入uic工具目录
./../../bin/qmake –unix #生成Makefile
make #编译
如果编译顺利通过,可以在qt目录的bin目录下看到moc、rcc、uic等工具。
2. 修改配置脚本
Qt4.5的嵌入式版本已经有了支持arm、mips、ppc等体系的配置脚本,但是它里面的arm配置脚本只针对标准的arm交叉编译器arm-linux-g++等,如果你的交叉编译器不是这个,需要建立自己的配置脚本。修改已有的arm配置脚本然后。在qt目录下运行:
cd mkspecs/qws/linux-arm-g++ # 进入配置脚本所在目录
vi qmake.conf # 打开配置脚本
内容修改为如下所示后保存退出(其他内容不变)。
QMAKE_CC = arm_v5t_le-gcc #我们用的是ti的平台
QMAKE_CXX = arm_v5t_le-g++
QMAKE_LINK = arm_v5t_le-g++
QMAKE_LINK_SHLIB = arm_v5t_le-g++
# modifications to linux.conf
QMAKE_AR = arm_v5t_le-ar cqs
QMAKE_OBJCOPY = arm_v5t_le-objcopy
QMAKE_STRIP = arm_v5t_le-strip
3. 选择配置选项
配置选项的选择是关键工作,必须认真仔细,可参考的信息有README、INSTALL文件和配置帮助信息,其中配置帮助信息最为重要。在qt目录下运行:
./configure –h
可看到大量的帮助信息,根据需要配置,初步得到的配置选项如下:
./configure --prefix=/usr/qt -opensource -fast -no-largefile -no-sql-QtSql -no-qt3support -no-xmlpatterns -no-phonon -no-phonon-backend -no-svg -no-webkit -no-mmx -no-3dnow -no-sse -no-sse2 -no-libtiff -qt-libpng -no-libmng -no-libjpeg -no-openssl -no-opengl -no-nis -no-cups -no-iconv -no-dbus -xplatform qws/linux-davinci-g++ -embedded arm –arch arm -no-armfpa -little-endian -host-little-endian –qt-freetype -nomake demo -nomake examples -nomake tools -nomake docs -depths 16,18,24 -no-glib
-xplatform qws/linux-arm-g++指定的为上小节修改的脚本。另外的一些选项指示去掉不需要的模块,初步实现了模块裁剪。
为了方便以后的配置,我把这些配置命令存放到一个自己建立的脚本conf.sh,以后再需要再次配置时只需要在qt目录下运行如下命令即可:
. ./conf.sh
4. 编译
Qt源码树下包含了大量的模块库和第三方库,虽然我们在配置选项中把一些模块库去掉,但是这只是表明qt库不依赖去掉的模块库,并不代表qt的脚本不编译这些库。实际上默认情况下qt编译源码树中所有的库代码,这就大大增加了编译过程出错的可能,而我们只需要其中很少的一部分,所以我们不在qt目录下运行make编译命令,而是进去到我们需要的模块库目录中手动单独编译。
首先编译qt核心库(corelib),在qt目录下运行:
cd src/corelib/ # 进入核心库目录
./../../bin/qmake –unix # 手动生成Makefile
make # 编译
如果编译顺利通过,会在qt目录下的lib目录中生成libQtCore.so系列库文件。然后编译网络库(network),在qt目录下运行:
cd src/network/ # 进入网络库目录
./../../bin/qmake –unix # 手动生成Makefile
make # 编译
如果编译顺利通过,会在qt目录下的lib目录中生成libQtNetwork.so系列库文件。接着编译界面库(gui),在qt目录下运行:
cd src/gui/ # 进入界面库目录
./../../bin/qmake –unix # 手动生成Makefile
make # 编译
如果编译顺利通过,会在qt目录下的lib目录中生成libQtGui.so系列库文件。至此,我们需要的库编译完成了,通过ls –lh 命令查看发现这些库文件的大小分别为:
libQtCore.so.4.5.3 3.0M
libQtNetwork.so.4.5.3 1019K
libQtGui.so.4.5.3 12M
5. 测试qt库
本次测试使用的设备没有鼠标键盘等设备,采用nfs方式挂接远程文件系统到设备上。在目标文件系统中新建目录:
mkdir /usr/qt # 创建目录
chmod –R 777 /usr/qt # 修改目录权限属性
该路径与配置的安装路径(--prefix=/usr/qt)一致,然后把主机上Qt目录下的lib整个文件夹拷贝过来。交叉编译qt源码树中的一个示例程序,本次编译的例子为qt目录下的:
examples/mainwindows/application
编译完成后把生成的可执行文件application拷贝到目标文件系统的根目录下,运行:
./application –qws
提示以下信息:
Cannot open keyboard: No such device or address
程序可正常运行,显示器清晰正确显示程序界面,说明qt库的移植已成功。
后面我还需要做大量的裁剪工作,希望和有共同喜好的大侠学习!~
tar –zxvf qt-embedded-linux-opensource-src-4.5.3.tar.gz
cd qt-embedded-linux-opensource-src-4.5.3
注意:不能修改解压后的qt目录名,否则无法编译通过,提示的错误信息不确定。
1. 编译qt工具
在交叉编译qt库的过程中,需要用到qt提供的工具,包括moc、uic、rcc等。这些工具是在编译主机上运行的,如果我们一开始就直接交叉编译,那么编译出来的这些工具是目标体系的,当在主机需要使用这些工具的时候无法运行,提示出错:
-bash ../bin/moc: cannot execute binary file
所以需要对这些工具进行单独编译(非交叉),在Qt目录下运行:
./configure #配置
cd src/tools/bootstrap #进入工具目录
./../../bin/qmake –unix #生成Makefile
make #编译
cd ../moc #进入moc工具目录
./../../bin/qmake –unix #生成Makefile
make #编译
cd ../rcc #进入rcc工具目录
./../../bin/qmake –unix #生成Makefile
make #编译
cd ../uic #进入uic工具目录
./../../bin/qmake –unix #生成Makefile
make #编译
如果编译顺利通过,可以在qt目录的bin目录下看到moc、rcc、uic等工具。
2. 修改配置脚本
Qt4.5的嵌入式版本已经有了支持arm、mips、ppc等体系的配置脚本,但是它里面的arm配置脚本只针对标准的arm交叉编译器arm-linux-g++等,如果你的交叉编译器不是这个,需要建立自己的配置脚本。修改已有的arm配置脚本然后。在qt目录下运行:
cd mkspecs/qws/linux-arm-g++ # 进入配置脚本所在目录
vi qmake.conf # 打开配置脚本
内容修改为如下所示后保存退出(其他内容不变)。
QMAKE_CC = arm_v5t_le-gcc #我们用的是ti的平台
QMAKE_CXX = arm_v5t_le-g++
QMAKE_LINK = arm_v5t_le-g++
QMAKE_LINK_SHLIB = arm_v5t_le-g++
# modifications to linux.conf
QMAKE_AR = arm_v5t_le-ar cqs
QMAKE_OBJCOPY = arm_v5t_le-objcopy
QMAKE_STRIP = arm_v5t_le-strip
3. 选择配置选项
配置选项的选择是关键工作,必须认真仔细,可参考的信息有README、INSTALL文件和配置帮助信息,其中配置帮助信息最为重要。在qt目录下运行:
./configure –h
可看到大量的帮助信息,根据需要配置,初步得到的配置选项如下:
./configure --prefix=/usr/qt -opensource -fast -no-largefile -no-sql-QtSql -no-qt3support -no-xmlpatterns -no-phonon -no-phonon-backend -no-svg -no-webkit -no-mmx -no-3dnow -no-sse -no-sse2 -no-libtiff -qt-libpng -no-libmng -no-libjpeg -no-openssl -no-opengl -no-nis -no-cups -no-iconv -no-dbus -xplatform qws/linux-davinci-g++ -embedded arm –arch arm -no-armfpa -little-endian -host-little-endian –qt-freetype -nomake demo -nomake examples -nomake tools -nomake docs -depths 16,18,24 -no-glib
-xplatform qws/linux-arm-g++指定的为上小节修改的脚本。另外的一些选项指示去掉不需要的模块,初步实现了模块裁剪。
为了方便以后的配置,我把这些配置命令存放到一个自己建立的脚本conf.sh,以后再需要再次配置时只需要在qt目录下运行如下命令即可:
. ./conf.sh
4. 编译
Qt源码树下包含了大量的模块库和第三方库,虽然我们在配置选项中把一些模块库去掉,但是这只是表明qt库不依赖去掉的模块库,并不代表qt的脚本不编译这些库。实际上默认情况下qt编译源码树中所有的库代码,这就大大增加了编译过程出错的可能,而我们只需要其中很少的一部分,所以我们不在qt目录下运行make编译命令,而是进去到我们需要的模块库目录中手动单独编译。
首先编译qt核心库(corelib),在qt目录下运行:
cd src/corelib/ # 进入核心库目录
./../../bin/qmake –unix # 手动生成Makefile
make # 编译
如果编译顺利通过,会在qt目录下的lib目录中生成libQtCore.so系列库文件。然后编译网络库(network),在qt目录下运行:
cd src/network/ # 进入网络库目录
./../../bin/qmake –unix # 手动生成Makefile
make # 编译
如果编译顺利通过,会在qt目录下的lib目录中生成libQtNetwork.so系列库文件。接着编译界面库(gui),在qt目录下运行:
cd src/gui/ # 进入界面库目录
./../../bin/qmake –unix # 手动生成Makefile
make # 编译
如果编译顺利通过,会在qt目录下的lib目录中生成libQtGui.so系列库文件。至此,我们需要的库编译完成了,通过ls –lh 命令查看发现这些库文件的大小分别为:
libQtCore.so.4.5.3 3.0M
libQtNetwork.so.4.5.3 1019K
libQtGui.so.4.5.3 12M
5. 测试qt库
本次测试使用的设备没有鼠标键盘等设备,采用nfs方式挂接远程文件系统到设备上。在目标文件系统中新建目录:
mkdir /usr/qt # 创建目录
chmod –R 777 /usr/qt # 修改目录权限属性
该路径与配置的安装路径(--prefix=/usr/qt)一致,然后把主机上Qt目录下的lib整个文件夹拷贝过来。交叉编译qt源码树中的一个示例程序,本次编译的例子为qt目录下的:
examples/mainwindows/application
编译完成后把生成的可执行文件application拷贝到目标文件系统的根目录下,运行:
./application –qws
提示以下信息:
Cannot open keyboard: No such device or address
程序可正常运行,显示器清晰正确显示程序界面,说明qt库的移植已成功。
后面我还需要做大量的裁剪工作,希望和有共同喜好的大侠学习!~