一个不错的makfile 模板解析

[size=large]先简述下一个c语言项目源码安装的过程
1. ./configure xxxxx
这个过程主要用于生成相应的Makefile,不同的编译选项就会产生不同的makefile.这样以来就可以为不同的CPU(x86? ppc?),机器运行环境,运行参数,安装目录等生成相应的makefile.
2. make
该步骤就是编译
3. make install
该步骤就是为编译的好的可执行文件、配置文件的拷贝。

本文用一个简单的例子简述这个makefile的构成,作为最近学习的总结
本工程文件如下:[/size]

main.c //工程主程序
Makefile //makefile文件
Make.properties//makefile的一些编译参数
project.h //用于包含工程中的一些结构体定义,名字一般取项目名称,例如:pppd.h
util.c
util.h


[size=large]这里讲讲全局变量的定义,我个人比较喜欢把全局变量在main.c里面定义,然后再project.h 里面 extern ,所有的其他的.c文件都包含project.h ,如果某个变量只在本文件被使用,可以定义成static 的全局变量,避免其他文件的访问。

所有函数声明都写在.h文件中,例如util.c里面的函数,全部在util.h 里面声明,想调用就直接引用util.h即。

所有的.h 文件最好加上下面这些宏,以免出现重复包含。[/size]

#ifndef __PAGENT_H__
#define __PAGENT_H__


[size=large]OK,来看下我的全能makefile模板吧[/size]

下面是Make.properties

CC = gcc -Wall -g
DEFS = -pthread -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -D_LARGEFILE64_SOURCE
LIBS = -lpthread
INCL =
CFLAGS = $(DEFS) $(INCL)


[size=large]CC,就是编译的命令了哦,这里普通的gcc 哦,在ppc就不是这个了啊。一般都做成在./configure 里面选择。
DEFS 是编译的一些选项
LIBS就是我们应用的库,这里我应用的phtread的.so,这个在/usr/lib这个默认目录下是存在的,如果要应用其他路径的.so,请加上-Lxxxx.

INCL 用于加一些额外的头部文件,例如-Ixxxx 默认当然是/usr/include/了。

下面是Makefile文件[/size]

include Make.properties

COMMONOBJS = util.o
OBJS = main.o
TARGET = project
DEPEND = project.h util.h


.PHONY: install clean

all: $(TARGET)

$(TARGET): $(OBJS) $(COMMONOBJS) $(DEPEND)
$(CC) $(CFLAGS) -o $(TARGET) $(OBJS) $(COMMONOBJS) $(LIBS)

%.o:%.c
$(CC) $(CFLAGS) -o $@ -c $<

install:
-cp -af project /sbin/

clean:
rm -rf $(OBJS) $(TARGET) $(COMMONOBJS)


[size=large]COMMONOBJS :这个是将要生成的.o文件,一个.c文件生成一个.o ,也就是说你的工程有几个.c文件,都在这里加上。

TARGET :这个就是你讲要生产的可执行文件,例如httpd等

DEPEND :就是你项目中的.h文件

all: $(TARGET)

这一部将会生成你所需要的可执行文件,makfile和ant一样,$(TARGET)其实就是all的前缀。
[/size]
[size=large]$(TARGET): $(OBJS) $(COMMONOBJS) $(DEPEND)
$(CC) $(CFLAGS) -o $(TARGET) $(OBJS) $(COMMONOBJS) $(LIBS)

%.o:%.c
$(CC) $(CFLAGS) -o $@ -c $<

==========
这一块就是变成的具体命令,首先他会执行

%.o:%.c
$(CC) $(CFLAGS) -o $@ -c $<

这一段就会把.c文件生成.o ,下面$@ $< 从上面传下来的参数。

然后就是执行
$(CC) $(CFLAGS) -o $(TARGET) $(OBJS) $(COMMONOBJS) $(LIBS)

即把所有的.o链接成一个可执行文件

本项目具体的执行过程如下


gcc -Wall -g -pthread -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -D_LARGEFILE64_SOURCE -o main.o -c main.c
gcc -Wall -g -pthread -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -D_LARGEFILE64_SOURCE -o util.o -c util.c
gcc -Wall -g -pthread -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -D_LARGEFILE64_SOURCE -o project main.o util.o -lpthread

可以很清楚的看到,首先生成 .o ,然后把.o 链接成可以执行文件

这个makefile虽然不高级,这个工程很简单,但是麻雀虽然小五脏俱全。加上一个configure文件,就算是比较专业的了。至少我经历过的项目都是这样搞的。

文章内容相对比较浅显,作为最近学习的一个总结。
[/size]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值