Qt/Extended 的Ubuntu配置
一)环境的搭建
1. 准备工作:
Qt/E环境配置需要三大文件:
a) QT文件系统: qt-creator-linux-x86-opensource-2.5.2.bin
b) Qt的源码: qt-everywhere-opensource-src-4.8.5.tar.gz
c) 触摸屏文件系统(作为测试用):tslib-1.4.tar.gz
d) 交叉编译工具:arm-linux-gcc-4.5.1.tar.gz
e) VM操作系统:VMware-workstation-full-12.1.1-3770994.exe
f) Ubuntu12.04操作系统:ubuntu-12.04-beta2-desktop-i386.iso
以上四个文件是必须的,可从下面的链接中获取:
链接:http://pan.baidu.com/s/1boCXgOR密码:o5ev
e和f两个系统请自行配置装载,作者在这里不再陈述。
2. 安装步骤:
1. 环境的搭建:Ubuntu12.04操作系统、arm-linux-gcc-4.5.1.tar.gz、tslib-1.4
a) Ubuntu12.04的安装和初配置 (略)
b) arm-linux-gcc-4.5.1.tar.gz配置(已配置好的请忽略该步骤)
1) 将文件共享到ubuntu的:/usr/local/下,解压
sudo tar –zxvfarm-linux-gcc-4.5.1.tar.gz (普通用户的解压方式)
2) 解压后生成一个名为user的文件夹,为了防止在配置环境的时候出现和Ubuntu系统的/usr目录有冲突现象,作者把该user/local/arm复制到Ubuntu下的/usr/local/下,形成目录为/usr/locar/arm,把解压后的文件夹删除
3) 配置环境变量:
进入环境变量配置文件:sudo vim ~/.bashrc中进行配置,添加
export PATH=$PATH:/usr/locar/arm/4.5.1/bin (注意这里是有冒号的(”:”))
4) 重新打开一个terminal,使该修改生效: sudosource ~/.bashrc
5) 查看是否成功:
arm-linux-gcc–v, 若出现以下则成功:
c) 配置触摸屏校验工具:
1) 将文件tslib-1.4.tar.gz共享到/opt目录下(当然读者可以放在任何你喜欢的目录下),解压:
sudo tar –zxvftslib-1.4.tar.gz,
完成后在/opt下生成一个目录:tslib
2) 进行配置加载:
1. 配置系统所需要的依赖文件:sudo apt-get install autoconfautomake libtool 这三个文件
2. 进入tslib目录,找到autogen.sh脚本文件,运行之。
sudo ./autogen.sh
3. 配置configure命令
sudo ./configure --prefix=/usr/local/tslib--host=arm-linux ac_cv_func_malloc_0_nonnull=yes (上下是一行的)
4. 最后执行编译命令:
make
make install
make过程中可能会遇到以下错误:
这是因为在函数ts_calibrate.c中的第227行和229行开始的open函数的参数写少了参数的权限,可以自行查看open的表达式:man 2 open
现在修改:
进入当前目录的tests中,vim ./tests/ts_calibrate.c 修改
修改的内容如下:
cal_fd= open(calfile,O_CREAT|O_RDWR,0777);
cal_fd= open(“/etc/pointercal”,O_CREAT|O_RDWR,0777);
即可。
然后继续make
以上配置成功的话,那么在/usr/local/tslib就会出现我们需要的库文件
以上文件主要使用到的是include和lib
(
命令解释:
--prefix=/usr/local/tslib 表示configure在/usr/local/中生成tslib这个目录;
--host=arm-linux 表示运行的环境是arm-linux;
ac_cv_func_malloc_0_nonnull=yes 为了防止交叉编译的出现undefined reference to ‘rpl_malloc’错误
)
2. 安装Qt Creator
将qt-creator-linux-x86-opensource-2.5.2.bin拷贝到Ubuntu目录下,运行文件:
sudo ./ qt-creator-linux-x86-opensource-2.5.2.bin
安装完成后再当前目录下生成一个目录为:qtcreator,可运行的文件为该目录下的bin/ qtcreator,(可以运行 ./ qtcreator/bin/ qtcreator,但是里面没有源代码)
说明暂时还不能进行Qt版本的识别,需要安装相应的Qt源代码,下面会给大家看演示相应的配置
如果你直接运行qtcreator,可能会发生以上的错误提示
这个是因为在自己相应的家目录中的.config/Nokia/下的文件权限不够,修改他的权限即可不会再次出现该情况
chmod 777 ~/.config/Nokia -R
3. 编译Qt库源代码
(该步骤安装时间比较长,请耐心等,全程弄好,估计需要3小时左右)
a) 将qt-everywhere-opensource-src-4.8.5.tar.gz拷贝到Ubuntu的opt目录下,并进行解压
sudo tar –zxvf qt-everywhere-opensource-src-4.8.5.tar.gz
生成qt-everywhere-opensource-src-4.8.5目录
b) 将qt-everywhere-opensource-src-4.8.5目录拷贝三份到/usr/local中,分别命名为Qt-PC,Qt-ARM,Qt-X86
c) 进入Qt-PC的编译(约1.5小时)
1) 由于在x11平台中进行编译,可能会遇到以下的错误:
Basic Xlibfunctionality test failed!
这是因为Xlib库并没有被安装,因此需要安装该库来解决在X11中运行出错的问题:
sudo apt-get install libx11-dev libxext-dev libxtst-dev
2) 执行sudo ./configure
这里我们使用o选项,作为开源版本进行选择
然后选择o之后,出现以下选项,这里我们选择yes,直接接受它本身提供的版本,省时间
在这过程你可能会遇到下面的提示测试失败,是因为没有进行x11平台的库的安装,这就是第一步先安装的原因。如果第一步安装了X11平台的库,这句话就不会出现,出现之后按照第一步进行软件更新即可,重新./configure即可
3) 执行make
4) 执行make install
d) 进入Qt-X86进行配置 (约3小时)
1) 这步骤主要是安装模拟器qvfb(Qt virtual framebuffer)
2) 配置configure
./configure -embedded x86 -qt-gfx-qvfb -qt-kbd-qvfb -qt-mouse-qvfb
3) make
4) make install
以上三步的配置中时间会比较长,
配置完成之后会在/usr/local目录的Trolltech 生产QtEmbedded-4.8.5
5) 进入Qt-PC目录中的tools/qvfb目录执行以下操作:
make //在Qt-PC/bin中生成qvfb可执行文件,(当然可以通过命令行生成qvfb这个可执行文件,这里不再详述)
sudo cp /Qt-PC/bin/qvfb /usr/local/Trolltech/QtEmbedded-4.8.5/bin
将qvfb这个文件复制到QtEmbedded-4.8.5/bin下
(这一步可能会有make的错误, X11/extensions/XTest.h找不到这个文件,可以通过以下操作修复:
Sudoapt-get install xorg-dev
如果上述方法还不能解决,那么需要查看Qt-PC/tools/qvfb/下的Makefile,查看LIBS是否有-lXtst,没有则添加,然后重新make
)
上述的操作可能遇到以下问题:
这是因为png库动态库的链接失败,现在修改如下:
1. 查看自己系统大libpnb库: locate libpng
2. 建立上述图片的第一个动态库的动态链接
ln -s /lib/i386-linux-gnu/libpng12.so.0 /lib/i386-linux-gnu/libpng.so
3. 修改当前目录的Makefile,打开找到 LIBS项(大概在第19行)
在LIBS末尾添加
-L/lib/i386-linux-gnu –lpng,然后重新编译即可
e) 进入Qt-ARM进行配置
1) 配置configure
./configure -prefix /usr/local/Trolltech/QtEmbedded-4.8.5-arm-opensource -confirm-license -release -shared -embeddedarm -xplatform qws/linux-arm-g++ -depths16,18,24 -fast -optimized-qmake -pch -qt-sql-sqlite -qt-libjpeg -qt-zlib-qt-libpng -qt-freetype -little-endian -host-little-endian -no-qt3support -no-libtiff -no-libmng-no-opengl -no-mmx -no-sse -no-sse2 -no-3dnow -no-openssl -no-webkit-no-qvfb -no-phonon -no-nis -no-opengl -no-cups -no-glib -no-xcursor-no-xfixes -no-xrandr -no-xrender-no-separate-debug-info -nomake examples -nomake tools -nomake docs -qt-mouse-tslib -I/usr/local/tslib/include -L/usr/local/tslib/lib
其中-prefix /usr/local/Trolltech/QtEmbedded-4.8.5-arm说明待会进行make或者make install的时候要生成的文件目录为QtEmbedded-4.8.5-arm,如果没有这个参数的话,待会生成的文件就是所谓的Qt-4.8.5,把原来已经生成的Qt-4.8.5覆盖,浪费了刚才编译的时间。
-I/usr/local/tslib/include -L/usr/local/tslib/lib使用到了我们之前配置触摸屏的库函数,这是为了以后移植Qt/E做好准备的
那么这时候你可能会遇到一些下面的错误:
这个问题是因为在configure的。第一句话说明在configure参数配置中,没有使用到pkg-config的,因此在configure的参数配置上添加:-force-pkg-config
./configure -force-pkg-config–prefix /usr/local/Trolltech/QtEmbedded-4.8.5-arm-opensource -confirm-license -release -shared -embedded arm -xplatformqws/linux-arm-g++ -depths 16,18,24 -fast -optimized-qmake -pch -qt-sql-sqlite-qt-libjpeg -qt-zlib -qt-libpng -qt-freetype -little-endian -host-little-endian -no-qt3support -no-libtiff -no-libmng -no-opengl -no-mmx -no-sse -no-sse2 -no-3dnow-no-openssl -no-webkit -no-qvfb -no-phonon -no-nis -no-opengl -no-cups -no-glib-no-xcursor -no-xfixes -no-xrandr-no-xrender -no-separate-debug-info -nomake examples -nomake toolso -nmake docs-qt-mouse-tslib -I/usr/local/tslib/include -L/usr/local/tslib/lib
当配置上面之后,可能还是会出现下面的情况:
通常情况下都是在配置生成tslib库的时候路径不对或者配置tslib失败所导致的。因此我们暂时可以先把tslib库删除之后,重新编译编译一次。
(笔者曾试过把tslib库安装在一个共享的目录下,譬如samba下的共享目录,但是这样就会导致上面的过程无法通过。笔者猜想可能是共享的时候使用的不是编译好的静态库,而是使用的是外部动态链接库,导致环境配置不成功。当然读者可以尝试配置pkg-config的环境来配置该情况,但笔者水平有限,试过不成功。)
2) Make
make之后可能出现以下的情况:
thread/qthread_unix.cpp: In function 'QThreadData*get_thread_data()':
thread/qthread_unix.cpp:182:12: error: 'currentThreadData' wasnot declared in this scope
thread/qthread_unix.cpp: In function 'void set_thread_data(QThreadData*)':
thread/qthread_unix.cpp:192:5: error: 'currentThreadData' wasnot declared in this scope
thread/qthread_unix.cpp: In function 'void clear_thread_data()':
thread/qthread_unix.cpp:201:5: error: 'currentThreadData' wasnot declared in this scope
thread/qthread_unix.cpp: In function 'QThreadData*get_thread_data()':
thread/qthread_unix.cpp:187:1: warning: control reaches end ofnon-void function
make[1]: *** [.obj/release-shared-emb-arm/qthread_unix.o] 错误 1
make[1]:正在离开目录 `/home/psr/sofsware/qt-arm/src/corelib'
make: *** [sub-corelib-make_default-ordered] 错误 2
这个时候需要修改qthread_unix.cpp 和qatomic_armv5.h两个文件:
在当前目录下的./src/corelib/thread/qthread_unix.cpp中,必须把第一个出现的HAVE_TLS注销掉,因为链接库的时候影响了使用的函数
进入当前目录的qatomic_armv5.h文件中进行修改内容
sudo vim ./src/corelib/arch/qatomic_armv5.h
随着make不断在进行执行,可能会遇到以下一样的问题
这是因为libQtGui.so找不到需要链接的函数库。因此在qmake.conf中进行修改如下:
打开当前QT-ARM目录下qmake.conf,
sudo vim./mkspecs/qws/linux-arm-g++/qmake.conf, 添加-lts即可
3) make install
4) 完成上面的是时候,在/usr/local/Trolltech/中就会自动生成QtEmbedded-4.8.5-arm目录
4. 测试qvfb
在命令行中运行:
./qvfb
1. 如果读者是在root用户下运行的话,那么以后也将会并且只能在root权限下运行qvfb,如果需要改为普通用户下可以运行的话,可以在删除/tmp/qtembedded-0/目录即可,并且重新在普通用户下运行qvfb即可
2. 运行中可能生成的时候出现以下信息
QLock::QLock: Cannot get semaphore/tmp/qtembedded-linux/QtEmbedded-0 'd' (2, No such file or directory)
这个问题可以忽略不需要进行解决,解决这个问题也比较复杂,但不影响我们进行编译仿真。
3. Qt creator配置:
1) 进入安装Qt Creator的目录中的bin中,运行./qtcreator
2) 打开Tools->Options->Build&Run->QtVersion,点击Add,选择刚才配置好的目录:
/usr/local/Trolltech/QtEmbedded-4.8.5/bin/qmake,点击确认
3) 重新启动qt creator,进行测试。
4) 点击file->new file orproject->Application->Qt Gui Application->choosen,然后修改名字,保存的路径等,会看到以下的界面
5) 一直next即可看到项目创建好的界面,点击左侧的project选项,点击Desktop的Run选项,然后在Run的配置中,点击Arguments,输入-qws
6) 打开Terminal,输入qvfb –width 800 –height 480 & (&表示在后台运行,创建一个画布为800 * 480大小,待会项目的显示将会显示在该屏幕上),如下运行所示
二)编译生成ARM平台的可执行文件
Qt/Embedded_X86可以在qvfb上进行显示,那时因为产生的可执行程序的类型属于intel类型的,并非arm类型,而且arm类型的可执行程序不能再qvfb(qt virtual frameBuffer)中运行,只能把arm移植到ARM平台上才可以运行。运行的命令一般是:
./file –qws
现在讨论的是,怎么样产生Qt/E下的ARM可执行程序
1) 配置ARM编译工具
a) 打开Qt creator,工具—>选项—>构建和运行—>Qt版本—>手动设置—>添加
b) 找到并添加上面配置好的文件/usr/local/Trolltech/QtEmbedded-4.8.5-arm/bin/qmake
c) 打开工具链,点击添加配置好的交叉编译器所带有的交叉编译工具
/usr/locar/arm/4.5.1/bin/arm-linux-g++,
同时ABI中可设置或选择 arm-linux-generic-elf-32bit(可以自定义设置)
(注意:作者这里的路径有更改,只要和您Ubuntu中的交叉编译一样就可以了)
d) 点击确定之后,新建一个空白的项目,然后会发现选择Embedded Linux的时候会出现以下的情况(需要先配置Embedded Linux,请看第e)步骤)
e) 修改上述的情况,按照以下步骤进行配置
1. 点击项目
2. 点击添加,然后会出现一个Embedded Linux,点击它,
3. 点击Embedded中的运行
4. 点击部署中的添加,把“部署设置”添加进来,其他不用操作
5. 在运行处点击添加“自定义执行档”,这个是主要来设置项目生成文件的保存
6. 配置矩形里面的东西,可先不用配置,以为还没有产生保存的文档
7. 左侧的运行图标变成绿色,表示可以执行构建,点击构建,会弹出自定义执行档的窗口,但是这时候已经产生了项目保存的文目录,点击找到当前目录下的保存目录(/home/bmc/dfgd-build-embedded-Qt_4_8_5__QtEmbedded-4_8_5-arm____/dfgd),然后点击确定即可
8. 点击构建运行,你会发现在应用程序输出框中出现
这是因为生成的是ARM平台的文件,不能再qvfb上运行的。这个问题笔者也没有解决,但是在保存的目录中查看文件的属性是为arm平台的可执行程序
(下面的两幅图为上面1~7步实际的步骤)
2) 利用命令行进行构建
a) 进入项目目录dfgd,运行
i. ./usr/local/Trolltech/QtEmbedded-4.8.5-arm/bin/qmake dfgd.pro
ii. ./usr/local/Trolltech/QtEmbedded-4.8.5-arm/bin/qmake
iii. Make
即可产生arm目标可执行文件
为了在任何地方都可以进行arm平台的qmake,那么现在进行全局环境变量的配置
sudovim ~/.bashrc
在末尾上添加:
alias qmake=’ /usr/local/Trolltech/QtEmbedded-4.8.5-arm/bin/qmake’
退出之后让配置生效,即可以立即生效
source ~/.bashrc