Qt程序移植到ARM(2)

ARM 96浏览

        在上一篇博客里讲到了如何编译安装嵌入式Qt的版本,这里我要讲如何将Qt的程序移植到ARM开发板上(c/c++的程序也可以)。

在这里我们介绍两种方法,第一种方法是不使用QtCreator直接在Linux终端下操作,第二种是使用QtCreator来进行编译,第一种方法的优点是不用安装QtCreator直接就可以操作,,缺点是由于是在命令行的界面下操作,程序错误的调试很不方便。第二种方法的优点是你可以直接用QtCreator来写程序,而且调试起来方便。

        首先介绍第一种方法,1.准备一个Qt或c++的程序,这里我们以简单的hello world为例,在使用嵌入式Qt版本编译之前我们还要先导出Qt的环境变量,导出的方法在第一篇博文中有介绍在此不在赘述,2.用qmake –v 命令查看Qt的版本是否正确了,如果版本对了就找到程序的入口main.cpp然后执行qmake  –project  main.cpp,执行完以后在你程序所在的目录下会产生一个以“.pro”为后缀的工程文件,我的程序生成的工程文件名字为Hello_World.pro。3.执行
qmakeHello_World.pro,执行完后在你的程序所在的目录下会生成一个Makefile的文件,至于Makefile文件的意义在此不细说。4.执行到了这一步你可以直接执行make,如果程序没有语法错误的话会编译生成一个可执行文件,但是这样生成的可执行文件是需要有动态链接库支持的,你可以用file命令去查看这个可执行文件的属性:


如果你的板子上没有移植Qt所需要的动态链接库,那么这个程序在板子上还是无法执行的,必须以静态链接的方式来编译,上一篇中编译Qt时加上“-static”参数的意义就在于此。具体做法是打开Makefile文件,找到以下几行:

####### Build rules

all: Makefile $(TARGET)

$(TARGET):  $(OBJECTS)  $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS)$(OBJCOMP) $(LIBS)

把它变成:

####### Build rules

all: Makefile $(TARGET)

$(TARGET): $(OBJECTS)  $(LINK) $(LFLAGS) -o$(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS) –static

保存退出后,再执行make就可以了,编译完成后用file查看可执行程序的属性 看是否是静态连接的:


如果编译成功就可以拷贝到开发板上运行了。


        第二种:用QtCreator,在Linux系统上安装QtCreator的过程在这里不讲了,安装完成后打开或者新建一个工程Hello World,然后你要添加编译器的版本和交叉编译工具链:选择左边菜单栏中的“project”选项中的第一项“Build Setting”,在“General”选项中有下面几个地方需要配置:


针对上面的几个选项我逐一做说明,"Qt version"选项是选择你需要的Qt版本,操作系统会自动检测你安装了的Qt版本,点击后面的“Manage”选择你之前安装的嵌入式Qt版本;"Tool chain"选项是选择编译器,这里我们需要将交叉编译工具添加进来,点击后面的“Manage”:


选择“Add->GCC”添加一个GCC选项,然后选中该选项对它进行配置:


“Compiler path”指的是你的交叉编译工具安装的路径,值得注意的是我们必须要选择交叉编译工具链"bin"目录下的“arm-none-linux-gnueabi-g++”因为Qt用的是c++编程的所以要用c++的编译器;"Debugger"指的是调试器,我们用交叉编译工具链"bin"目录下的“arm-none-linux-gnueabi-gdb”;点击"Apply",点击“OK”,如果在选择Qt版本时出现了“The
default mkspeasymlink is broken”的错误提示时,解决的方法是,进入你的嵌入式Qt的安装目录。进入mkspecs的目录,查看是否有一个叫“default”的软连接,如果有就删掉这个软链接,重新自己建立软链接:“ln -s qws/linux-arm-g++  default”

然后关闭QtCreator再重启就好了。

       在将你的Qt版本和编译器都配置完以后你就可以用QtCreator来编译Hello World程序了,编译成功之后你所编译出来的程序也是不能直接在开发板上使用的,一样也存在Qt动态链接库的依赖问题,所以你还必须找到Hello Word程序的Makefile文件,找到:

####### Build rules

all: Makefile $(TARGET)

$(TARGET):  $(OBJECTS)  $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS)$(OBJCOMP) $(LIBS)

变成:

####### Build rules

all: Makefile $(TARGET)

$(TARGET):  $(OBJECTS)  $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS)$(OBJCOMP) $(LIBS) -static

重新编译一次,如果编译成功了用file命令查看可执行程序是否是Arm下运行的静态链接的程序: