tmake学习笔记

最初接触tmake,是因为改别人的东西,到手的代码是qt2的,用tmake生成的Makefile。平台搭建、qt编译、环境变量设置,都是参照arm学习板提供的指导手册一步一步傻瓜式地完成的。tmake的基本使用方法一开始是别人教的,但也就教了2个命令:先用progen -o xxx.pro生成工程文件,然后用tmake xxx.pro -o Makefile生成Makefile。使用期间碰到了很多问题,所以写下这些东西以备查阅。


1、相关资料

tmake最有用的资料,当然是它自带的document。首先打开tmake目录下的readme文件,它会告诉你2条信息:

doc/tmake.html         -- User's Guide

doc/tmake_ref.html  -- Reference Manual

于是找到tmake/doc/目录下的这两个文件。

第一个文件是一个整体的Guide,看完基本上能够对tmake的流程和结构有清晰的了解,也能使用tmake建立起自己的Makefile了。第二个文件是参考手册,详细列举了tmake支持的参数,以及参数的值。如果E文读起来比较吃力的话,可以先参阅转载的《Tmake使用指南》,这篇文章就是对第一个文件的翻译。


读下面的内容前,请先了解doc/tmake.html或者《Tmake使用指南》。



2、使用tmake的前提

能用得起来,当然要先编译好。我用的tmake是在编译qt2的时候连带着一起编译好的,分pc和arm两个平台,编译了两个版本,分别在x86-qtopia-2.2.0/tmake/和arm-qtopia-2.2.0/两个目录下面。源码包和配置都是arm板带的资料光盘里的,所以编译过程很傻瓜,就不赘述了。然后,需要在命令行下建立2个变量TMAKEDIR和TMAKEPATH,并把它们加到PATH变量里面。以pc平台为例:

export TMAKEDIR=/xxx/..../x86-qtopia-2.2.0/tmake

export TMAKEPATH=$TMAKEDIR/lib/qws/linux-generic-g++

export PATH=$PATH:$TMAKEDIR

TMAKEDIR就是tmake所在的目录,TMAKEPATH是tmake模板所在的目录。

实际上,arm学习板一般都会提供已经写好的脚本,脚本里就包含这些内容,用的时候只要先source相关的脚本就可以了。


3、tmake工作流程


第一步是在shell里用progen命令(这是tmake自带的)生成xxx.pro文件,就是你的工程文件。tmake支持很多参数,而pro文件本质上就是显式地设置某些参数的值。以一个简单的pro文件为例:

TEMPLATE =  app
CONFIG   =  qt warn_on release
HEADERS  =  hello.h
SOURCES  =  hello.cpp main.cpp
TARGET   =  hello
这里面显式地指定了5个参数的值,等号左边是参数名字,右边是参数的值。参数的具体含义可以从名字上就猜出来,或者参考tmake的参考手册。


第二步是在shell里面,用tmake命令生成Makefile。


从”输入——输出“的角度来看,tmake的输入数据由两部分组成:参数的值和模板。参数的值从3个途径获得:一是xxx.pro文件;二是shell里跟在tmake后面的参数;三是tmake.conf里面包含的参数值。这3个来源是有覆盖关系的。暂时知道的是,pro文件会覆盖tmake.conf文件里的同名参数。譬如,tmake.conf里对CONFIG参数的设置是CONFIG = qt warn_on release,若在pro文件里设置 CONFIG = qt warn_on bug,则最后起效果的是qt warn_on debug。


tmake.conf位于TMAKEPATH表示的目录里面。在这个目录能看到4个文件:tmake.conf 、app.t 、lib.t 、subdir.t,后面3个文件,实际上就是tmake的模板文件。tmake在读取了参数的值之后,就使用相关的模板,按照模板指定的步骤处理参数,最后得到输出数据——Makefile文件。使用哪个模板,是根据TEMPLATE的值来确定的。上例中,pro文件里“TEMPLATE = app"表明使用app.t模板。


4 一些注意的问题


1)关于连接时cannot find -lqte 的问题

这个问题一般有2个可能:一是libqte.so这个库没编译好;二是QPEDIR这个环境变量设置错误;三是Makefile中缺少libqte.so的目录信息。我碰到的是第三种。

编译完成会得到4个库:lqt、lqte、lqpe、lqtopia,对应的文件分别是libqt.so、libqte.so、libqpe.so、libqtopia.so,lqt位于qt2/lib,后三个库同在qtopia/lib目录中。lqt是x11环境下的共享库,lqte是基于framebuffer的Qt/E的共享库,lqpe和lqtopia是Qtopia的共享库。Qtopia是一个为PDA开发的桌面程序,基于Qt/E,所以生成一个Qtopia程序需要同时连接lqte、lqpe和lqtopia。


一般的嵌入式开发,TMAKEPATH设置的路径都是$TMAKEDIR/lib/qws/linux-generic-g++,这个路径下的tmake.conf文件已经默认连接-lqte库,也就是Qt/E的库。但是这里有一个bug。打开生成的Makefile,找到LIBS = xxxxx 这一行,这一行包含了库的目录信息和库的名字。仔细观察,可以发现等号右边有”-L$(QTDIR)/lib“,实际上$(QTDIR)/lib下的是lqt库,而不是lqte库,lqte库应该位于$(QPEDIR)/lib下。


解决方法有很多,最简单的是直接在Makefile中,把LIBS右边的-L$(QTDIR)/lib修改成-L$(QPEDIR)/lib,但每次生成Makefile都需要修改。另一种方法是手动添加库文件搜索路径:打开tmake.conf文件,可以看到一个参数TMAKE_LIBDIR,在等号右边加上$(QPEDIR)/lib就行,或者直接在pro文件中添加一行:TMAKE_LIBDIR=$(QPEDIR)/lib。


还有一种方法,就是在pro文件中,把CONFIG参数中的”qt“改成”qtopia“,这样在生成的Makefile中,LIBS参数就会把$(QPEDIR)/lib包含进去。


2)关于pro文件中的HEADERS参数

HEADERS参数,顾名思义,就是工程中的头文件列表。

在compile阶段,.h文件的所有内容被宏命令"include"拷贝进.cpp文件中,参与compile的只是经过预处理之后的cpp文件;而link阶段处理的是.o文件,也不涉及到头文件。所以HEADERS参数可以为空。.h文件加不加进HEADERS参数,对结果没影响。

但以上情况只是对非qt工程而言。在qt下,情况又有所不同。qt程序的头文件中会包含qt的关键字,譬如Q_OBJECT、signals等。tmake使用moc工具对这些关键字进行解释,解释的结果以c++代码的形式保存在以moc_开头的.cpp文件中。换句话说,moc工具依赖于这些头文件。所以,如果.h文件中有qt关键字,一定要写入HEADERS参数中。


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值