在Windows下利用mingw进行一些简单程序的编译还行,但是路径问题以及工具链的制作问题,总是会遇到麻烦,不如安装个虚拟机好用。曾试着在windows下编译下qt,后来坑太多果断放弃。自Win10推出ubuntu bash后,算是为在widows系统下开发运行linux程序带来了可能,我这里就试着在WIN10 bash下搭建了一个嵌入式qt的开发平台。WIN10 bash与在虚拟机上安装个ubuntu一样,都是同一套系统API,彼此兼容(有一些特殊设备bash未提供),不同之处在于,bash运行更高效,可以秒开,而且占用系统资源和空间更少,缺点是没有图形化界面。
WIN10 bash功能的打开参见https://jingyan.baidu.com/article/e73e26c0be8b6624adb6a7ba.html。
下面讲一讲怎么在win10 bash上搭建开发环境的一个示例。
首先下载Qt与tslib。Qt从官网上下载即可,这里选用4.8.7版本。tslib可以通过git下载,打开Win10 bash,通过 apt-get install git
安装git软件后,通过 git clone https://github.com/kergoth/tslib
下载tslib软件包。
安装几个软件包。
sudo apt-get install automake
sudo apt-get install autogen
sudo apt-get install autoconf
sudo apt-get install libtool
sudo apt-get install pkg-config
安装交叉编译工具。
sudo apt-get install g++-arm-linux-gnueabihf
开始编译tslib。
cd tslib
./autogen.sh
./configure --prefix=/usr/local/tslib --host=arm-linux-gnueabihf ac_cv_func_malloc_0_nonnull=yes --cache-file=arm-linux.cache
make
make install
其中,–prefix指定了tslib编译后安装的目录,–host指定了编译后运行所在的系统类型。
接着编译Qt。cd 到 qt-everywhere-opensource-src-4.8.7/mkspecs/qws 目录下,这里只有 linux-arm-gnueabi-g++ 的目录(我们的编译器选用的为gnueabihf),通过 cp linux-arm-gnueabi-g++ linux-arm-gnueabihf-g++ -r
拷贝个新的目录出来,然后修改 linux-arm-gnueabihf-g++/qmake.conf 文件的内容如下。
include(../../common/linux.conf)
include(../../common/gcc-base-unix.conf)
include(../../common/g++-unix.conf)
include(../../common/qws.conf)
QT_QPA_DEFAULT_PLATFORM = linuxfb
#QMAKE_INCDIR += /usr/local/tslib/include
#QMAKE_LIBDIR += /usr/local/tslib/lib
# modifications to g++.conf
QMAKE_CC = arm-linux-gnueabihf-gcc -lts
QMAKE_CXX = arm-linux-gnueabihf-g++ -lts
QMAKE_LINK = arm-linux-gnueabihf-g++ -lts
QMAKE_LINK_SHLIB = arm-linux-gnueabihf-g++ -lts
# modifications to linux.conf
QMAKE_AR = arm-linux-gnueabihf-ar cqs
QMAKE_OBJCOPY = arm-linux-gnueabihf-objcopy
QMAKE_STRIP = arm-linux-gnueabihf-strip
load(qt_config)
回到 qt-everywhere-opensource-src-4.8.7 目录下,创建一个脚本,这里命名为 autoconfig.sh,其内容如下。
#!/bin/sh
./configure \
-opensource \
-confirm-license \
-release -shared \
-xplatform qws/linux-arm-gnueabihf-g++ \
-little-endian \
-host-little-endian \
-embedded arm \
-force-pkg-config \
-optimized-qmake \
-pch \
-qt-sql-sqlite \
-qt-libjpeg \
-qt-zlib \
-qt-libpng \
-qt-freetype \
-no-opengl \
-no-sse2 \
-no-openssl \
-no-nis \
-no-opengl \
-no-cups \
-no-glib \
-prefix /usr/local/qt4.8.7 \
-no-xcursor -no-xfixes -no-xrandr -no-xrender \
-no-separate-debug-info \
-no-qt3support \
-no-iconv -nomake tools -nomake tests \
-qt-mouse-tslib \
-I /usr/local/tslib/include \
-L /usr/local/tslib/lib
exit
运行这个脚本,然后 make && make install 完成Qt的编译与安装。
我们编译好了Qt与tslib的库,总要找个板子测试一下。这里我选用一块 cortex-a9 的开发板,uboot与linux内核文件选用开发板光盘中的,文件系统选用 linaro 网站上一个ubuntu12.04版本的系统,链接https://releases.linaro.org/archive/12.04/ubuntu/precise-images/ubuntu-desktop/linaro-precise-ubuntu-desktop-20120426-119.tar.gz 。选用ubuntu的好处在与安装一些软件包比较方便,直接 apt-get 就行了。通过 mfgtool 工具将 uboot,内核,文件系统烧写到开发板上后,启动系统。在终端,通过 echo false > /etc/X11/default-display-manager
命令来取消桌面,使开发板屏幕系统启动后默认进入终端界面。因为感觉嵌入式设备要桌面没啥用,也浪费资源。
通过 apt-get install openssh-server
安装 ssh-server 服务,我们可以开始接下来的操作了。
进入 /usr/local/tslib 目录,ls 查看如下。
root@NOTE:/usr/local/tslib# ls
bin etc include lib
将 bin 目录下的文件拷贝到开发板的 /usr/bin 目录下,将 etc 目录下的文件拷贝到开发板的 /etc 目录下,将 lib 目录下的文件拷贝到开发板的 /usr/lib 目录下。这里拷贝文件建议用 scp 命令,拷贝软链接建议用 rsync -l。
进入 /usr/local/qt4.8.7 目录,ls 查看如下。
root@NOTE:/usr/local/qt4.8.7# ls
bin demos examples imports include lib mkspecs plugins tests translations
将 lib 目录下的所有文件拷贝到开发板的 /usr/lib 目录下,将 plugins 目录拷贝到开发板的 /usr 目录下。
将下面的内容添加到开发板 /etc/profile 文件中。
export TSLIB_TSDEVICE=/dev/input/event0
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/usr/lib/ts
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export LD_LIBRARY_PATH=/usr/lib:$LD_LIBRARY_PATH
export QT_QWS_FONTDIR=/usr/lib/fonts
export QWS_MOUSE_PROTO=tslib:/dev/input/event0
export QWS_DISPLAY=linuxfb
export QT_QPA_PLATFORM_PLUGIN_PATH=/usr/plugins
export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0
export QT_QPA_FONTDIR=/usr/lib/fonts
重启开发板上的系统,即完成了qt库与tslib库的安装,运行 ts_calibrate 命令可以进行触摸屏的校准。
qtcreator安装在W10 bash里,由于其只是一个终端,没有 X server,这里在win10系统里安装一个Xming软件,在win10系统里显示 bash 的 X GUI。先下载 qtcreator 的软件包,链接http://download.qt.io/official_releases/qtcreator/3.1/3.1.2/qt-creator-opensource-linux-x86_64-3.1.2.run 。安装时现在win10系统中打开Xming软件,然后在bash中执行 DISPLAY=:0 ././qt-creator-opensource-linux-x86_64-3.1.2.run
命令,安装界面会显示在windows系统上,如图所示。
按照默认设置一路点击next安装即可。
qtcreator使用调试功能,gdb是必不可少的。这里gdb是用来调试开发板上的应用,所以跟qt库一样,需要我们自己编译。从 http://ftp.gnu.org/gnu/gdb/ 上下载gdb-7.7.1.tar.gz(参照bash上的gdb版本)源码包。解压后进入gdb-7.7.1目录,先通过apt-get install python2.7-dev
安装python2.7-dev开发包,然后执行./configure --host=x86_64-linux-gnu --target=arm-linux-gnueabihf --with-python=python2.7
进行初始化。
这里说下builde,host,target这三个类型。
--build=BUILD configure for building on BUILD [guessed]
--host=HOST cross-compile to build programs to run on HOST [BUILD]
--target=TARGET configure for building compilers for TARGET [HOST]
build参数是指编译源码包的系统环境,一般不用配置,软件包会自动检测。host参数是指编译出来的工具运行在什么系统上,比如这里我们编译的gdb被qtcreator调用,是运行在ubuntu bash上,所以指定它为x86_64-linux-gnu,也是bash上gcc的前缀。target参数是指编译出来的工具所要操作的系统,这里gdb是用来远程调试arm开发板程序的,所以指定它为arm-linux-gnueabihf,与arm开发板上gcc编译器的前缀相同。
初始化后,make && make install 会将编译出的文件安装到/usr/local/bin 目录下。
接着还需要编译gdbserver,它运行在开发板上。
进入/gdb-7.7.1/gdb/gdbserver 目录,执行./configure --prefix=/opt/arm-gdb-server/ --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf
进行初始化,然后通过make && make install 命令安装。
进入/opt/arm-gdb-server 目录,tree 查看如下。
root@NOTE:/opt/arm-gdb-server# tree
.
├── bin
│ └── arm-linux-gnueabihf-gdbserver
└── share
└── man
└── man1
└── arm-linux-gnueabihf-gdbserver.1
4 directories, 2 files
将bin 目录下arm-linux-gnueabihf-gdbserver 文件拷贝到开发板/usr/bin 目录下即可。
进入/opt/qtcreator-3.1.2/bin 目录,执行DISPLAY=:0 ./qtcreator
命令启动qtcreator。然后点击Tools->Options->Build & Run,配置Qt Versions 如下图。
配置Compilers如下图。
配置Debuggers如下图。
这三个配置选择的文件均是通过上面的步骤安装的。点击确认后,通过Tools->Options->Devices选项来添加一个设备,也就是我们的开发板,配置图如下。
其中Name随便取名,Host name 为开发板的IP地址,Username 与Passwd 分别是开发板系统上的root用户与密码,GDB server executable 填写为arm-linux-gnueabihf-gdbserver,也就是前面安装的gdbserver文件名。其它不用填写,默认即可。点击确认后,再次点击Tools->Options->Build & Run,最后来配置Kits,配置图如下。
用qtcreator新建一个工程,这里取名默认untitled,Kits选择上面设置的QCC。在mainWindow.ui 上拖拽一个QPushButton 和QLabel 控件到窗体上,修改pushButton 的clicked 槽函数如下。
void MainWindow::on_pushButton_clicked()
{
static int i=0;
ui->label->setText(QString("hello world!--%1").arg(i++));
}
修改untitled.pro 文件,添加如下两行。
INSTALLS += target
target.path = /apps/
第一句指定将在开发板上执行的文件(target在untitled.pro文件中通过“TARGET = untitled”被定义),第二句指定了将可执行文件拷贝到开发板的目录。编译无误后,点击qtcreator窗体左侧的Projects,然后配置Run 选项,在Arguments 框中添加“-qws”,配置如下图。
最后开始调试了,在按键的槽函数中添加一个断点,启动开发板上的系统,网络接好,然后点击qtcreator 上的Start Debuging 按钮,开始调试。调试界面如图。
开发板上运行界面如下图。