编写多文件,多目录makefile(借鉴网上的一篇文章来自己练手)

(1)首先makefile文件的一些(红色字体是比较常用的)

预定义变量含义

  $*  不包含扩展名的目标文件名称。
  $+   所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件。
  $<   第一个依赖文件的名称。
  $?   所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚。
  $@  目标的完整名称。
  $^    所有的依赖文件,以空格分开,不包含重复的依赖文件。
  $%    如果目标是归档成员,则该变量表示目标的归档成员名称。例如,如果目标名称为   (image.o),则 $@ 为 ,而 $% 为 image.o。
  AR   归档维护程序的名称,默认值为 ar。
  ARFLAGS   归档维护程序的选项。

  AS  汇编程序的名称,默认值为 as。

  ASFLAGS  汇编程序的选项。

  CC C 编译器的名称,默认值为 cc。


  CFLAGS  C 编译器的选项。


  CPP    C 预编译器的名称,默认值为 $(CC) -E。

  CPPFLAGS     C 预编译的选项。
  CXX   C++ 编译器的名称,默认值为 g++。
  CXXFLAGS  C++ 编译器的选项。
  FC   FORTRAN 编译器的名称,默认值为 f77。
  FFLAGS    FORTRAN 编译器的选项。

(2)makefile文件详细资料 http://download.csdn.net/detail/rayzongx/4459237

点击打开链接

 

(3)例子:

|-->main.c
|-->example.c
|-->Makefile            
|-->foo------->|-->common.c
                     |-->foo.c
                     |-->Makefile


|-->bar------ >|-->bar.c
                     |-->common.c

                     |-->Makefile


|-->configs->|-->foo.h
                    |-->bar.h

(这是练习网上的一份多目录多文件的makefile文件的编写,有所删减)

bar目录下:

//bar.c文件

#include <stdio.h>
void  bar(int i)
{
printf("hell from %s() in file:%s,num:%d\n",__func__,__FILE__,i);
}
int hello_bar(void)
{
printf("in func:%s()\n",__func__);
foo(200);
common_bar();
printf("===============================\n");
return 0;
}

//common.c 文件

#include <stdio.h>
int common_bar(void)
{
printf("this is a common function in bar/common.c\n");
return 0;
}


对应的头文件bar.h(在configs目录下)
#ifndef BAR_H_
#define BAR_H_
void bar(int i);
int hello_bar(void);
#endif


foo目录下:

foo.c的代码

#include<stdio.h>
void foo(int i)
{
printf("hell form %s() in file %s,num:%d\n",__func__,__FILE__,i);
}
int hello_foo(void)
{
printf("in func:%s()\n",__func__);
bar(100);
common_foo();
printf("=================================\n");
return 0;
}

common.c的代码

#include <stdio.h>
int  common_foo(void)
{
printf("this is a common function in foo/common.c\n");
return 0;
}

对应的头文件foo.h(在configs目录下)

#ifndef __FOO_H__
#define __FOO_H__
void foo(int i);
int  hello_foo(void);
#endif /* end of include guard: __FOO_H__ */

Makefile文件:

(1)顶层目录的Makefile文件

jC=gcc 
CFLAGS=-Wall
DEBUG=y
ifeq ($(DEBUG),y)
CFLAGS +=-g
else
CFLAGS +=-O2
endif
SUBDIRS :=foo bar
LIBS :=foo/foo.a bar/bar.a
LDFLAGS=$(LIBS)
RM=-rm -rf


__OBJS=main.o
__OBJS+=example.o
__SRCS=$(subst .o,.c,$(__OBJS))
__LIBLINK=./configs/
target=a.out
MAKE=make
all:$(target)
$(__OBJS):$(__SRCS)
$(CC) $(CFLAGS) -c $^  -I $(__LIBLINK)
$(target):$(__OBJS)
for dir in $(SUBDIRS);\
do $(MAKE) -C $$dir all ||exit 1;\
done
$(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS)
clean:
@for dir in $(SUBDIRS);\
do make -C $$dir clean ||exit 1;\
done
$(RM) $(__OBJS) $(target) *.bak*~
.PHONY:all clean

(2)bar目录下的makefile文件

AR=ar
ARFLAGS=cr
LIB=bar.a
RM=-rm -rf
OBJS:=bar.o common.o
all:$(LIB)
$(LIB):$(OBJS)
$(AR) $(ARFLAGS) $@ $(OBJS)
clean:
$(RM) $(OBJS) $(LIB) *.bak*~
.PHONY:all clean

(3)foo目录下的makefile文件

AR=ar
ARFLAGS=cr
LIB=foo.a
RM=-rm -rf
OBJS:=foo.o common.o
all:$(LIB)
$(LIB):$(OBJS)
$(AR) $(ARFLAGS) $@ $(OBJS)
clean:
$(RM) $(OBJS) $(LIB) *.bak*~
.PHONY:all clean



最后总结:发这篇博文完全是为了移动复习之前的知识点,没有其他意思,当然若能对别人makefile的学习有点帮助那我更是欣喜不已。另外感谢网上有这么多的好资源。












  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值