一个通用Makefile的编写

出处:maychang 发布于:2010-03-03 10:24:14

  作者:杨硕,华清远见嵌入式学院讲师。

  现在我们讲使用数据库来进行变成,具体的提供了SELECT INSERT UPDATE DELETE等数据库的执行语句,这是在数据库的接口,当在图形下显示数据时需要使用到QSqlTableModel。所以在数据库编程之前需要掌握基础的SQL 命令语句。

  数据库驱动层

  相关联的类包含了QSqlDriver ,QSqlDriverCreatpor ,QSqlDriverCreatorBase,QSqlDriverPlugin与QSqlResult 。

  数据库的应用程序接口层

  这些类提供了访问数据库,提出一个连接请求,如同文件访问一样,当连接成功,讲通过判断信息返回信息,只要建立了连接就可以使用QSqlQuery 类来操作数据库, 在连接数据库之后还提供了几个类, 例如QSqlError ,QSqlField ,QSqlIndex 与QSqlRecord。

  用户接口层

  这些类提供了与数据相关的部件,包含了QSqlQueryModel,QSqlTableModel,与QSqlRelationTableModel 。这些类的定义使用是用来提供数据库的模式与试图来设计的。

  连接到数据库

  如果要建立一个数据库的连接, 首先要知道使用的什么数据库,并为这个数据库的连接加载驱动,如果是mysql 数据库,都会有用户名与密码,这也是必须设置的,被连接的数据库或许在本地或者在远程的某台计算机上,所以需要设置一个主机的名称来区别。

  下面是连接数据库的例子:

  QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");

  db.setHostName("bigblue");

  db.setDatabaseName("flightdb");

  db.setUserName("acarlson");

  db.setPassword("1uTbSbAs");

  bool k = db.open();

  我们在Linux环境下开发程序,少不了要自己编写makefile,一个稍微大一些的工程下面都会包含很多.c的源文件。如果我们用gcc去一个一个编译每一个源文件的话,效率会低很多,但是如果我们可以写一个Makefile,那么只需要执行一个make就OK了,这样大大提高了开发效率。但是Makefile的语法规则众多,而且缺乏参考资料,对于初学者来说,写起来还是有一定的难度,往往令很多人望而生畏。下面我们介绍一个比较通用而且简洁的Makefile,大家只要对它稍作修改就可以用在你们自己的工程里了。

  现在假设我们有一个工程叫my_project,工程源码目录下面有app1.c,app2.c,app3.c以及main.c这五个源文件。我们现在需要编译出app1.o,app2.o,app3.o以及main.o,然后再把这些.o文件链接成为一个ELF格式的可执行程序叫做my_app。我们先看一个简单的Makefile如何编写:

  my_app : main.o, app1.o, app2.o, app3.o, app4.o

  gcc –o my_app main.o app1.o, app2.o, app3.o, app4.o

  main.o : main.c

  gcc –c main.c

  app1.o : app1.c

  gcc –c app1.c

  app2.o : app2.c

  gcc –c app2.c

  app3.o : app3.c

  gcc –c app3.c

  clean :

  rm main.o app1.o, app2.o, app3.o, app4.o

  这是一个傻瓜式的Makefile,不灵活,而且不具备可复制性,想象一个如果我们的工程下面有50个源文件,那岂不是要一个一个写出来。我们的目标是写一个Makefile,只要稍作修改就可以在各个工程之间通用。

  下面这个Makefile就可以满足这个要求:

  SRCS = $(wildcard *.c)

  BJS = $(SRCS:.c = .o)

  CC = gcc

  INCLUDES = -I/home/noah/build_sqlite3/include

  LIBS = -L/home/noah/build_sqlite3/lib -lsqlite3

  CCFLAGS = -g -Wall -O0

  my_app : $(OBJS)

  $(CC) $^ -o $@ $(INCLUDES) $(LIBS)

  %.o : %.c

  $(CC) -c $< $(CCFLAGS)

  clean:

  rm *.o

  大家看这个Makefile和前一个比起来是不是简洁很多,当然理解起来不如上一个那么直观。实际上编写Makefile就是为了提高我们的工作效率,而不是增加我们的工作量。因此Makefile为我们提供了很多强大的功能,比如定义变量,使用通配符等等。只要合理利用,就可以达到事半功倍的效果。

  下面我们一条一条分析这个Makefile:

  SRCS = $(wildcard *.c)

  这条语句定义了一个变量SRCS,它的值就是当前面目录下面所有的以.c结尾的源文件。

  BJS = $(SRCS:.c = .o)

  这里变量OBJS的值就是将SRCS里面所有.c文件编译出的.o目标文件

  CC = gcc

  变量CC代表我们要使用的编译器

  INCLUDES = -I/home/noah/build_sqlite3/include

  LIBS = -L/home/noah/build_sqlite3/lib -lsqlite3

  这里指定除了编译器默认的头文件和库文件的路径之外需要额外引用的头文件路径以及库的路径。

  CCFLAGS = -g -Wall -O0

  CCFLAGS变量存放的是编译选项

  my_app : $(OBJS)

  $(CC) $^ -o $@ $(INCLUDES) $(LIBS)

  my_app依赖于所有的.o文件,$^代表$(OBJS),$@代表my_app

  %.o : %.c

  $(CC) -c $< $(CCFLAGS)

  将所有的.c源代码编译成.o目标文件,这样写是不是很省事?

  clean:

  rm *.o

  在执行make clean之后删除所有编译过程中生成的.o文件。

  这个Makefile就具备灵活的通用性,我们只要对它稍作修改就可以用在自己的工程里面。当然Makefile还有很多强大的功能,需要我们进一步学习。

  “本文由华清远见https://www.embedu.org/index.htm提供”



  

版权与免责声明

凡本网注明“出处:维库电子市场网”的所有作品,版权均属于维库电子市场网,转载请必须注明维库电子市场网,https://www.dzsc.com,违反者本网将追究相关法律责任。

本网转载并注明自其它出处的作品,目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性,不承担此类作品侵权行为的直接责任及连带责任。其他媒体、网站或个人从本网转载时,必须保留本网注明的作品出处,并自负版权等法律责任。

如涉及作品内容、版权等问题,请在作品发表之日起一周内与本网联系,否则视为放弃相关权利。

广告
上传BOM文件: BOM文件
*公司名:
*联系人:
*手机号码:
QQ:
应用领域:

有效期:
OEM清单文件: OEM清单文件
*公司名:
*联系人:
*手机号码:
QQ:
有效期:

扫码下载APP,
一键连接广大的电子世界。

在线人工客服

买家服务:
卖家服务:

0571-85317607

客服在线时间周一至周五
9:00-17:30

关注官方微信号,
第一时间获取资讯。

建议反馈

联系人:

联系方式:

按住滑块,拖拽到最右边
>>
感谢您向阿库提出的宝贵意见,您的参与是维库提升服务的动力!意见一经采纳,将有感恩红包奉上哦!