1.
main.c文件
#include <stdio.h>
#include "add.h"
#include "sub.h"
int main(void)
{
int a=1,b=2;
float x=2.3,y=2.4;
printf("int a+b=%d\n",add_int(a,b));
printf("float x+y=%f\n",add_float(x,y));
printf("int a-b=%d\n",sub_int(a,b));
printf("float x-y=%f\n",sub_float(x,y));
return 0;
}
2.
add/add_int.c文件
int add_int(int a,int b)
{
return a+b;
}
3.
add/add_float.c文件
float add_float(float a,float b)
{
return a+b;
}
4.
add/add.h文件
#ifndef __ADD_H__
#define __ADD_H__
extern int add_int(int a,int b);
extern float add_float(float a,float b);
#endif
5.
sub/sub_float.c文件
float sub_float(float a,float b)
{
return a-b;
}
6.
sub/sub_int.c文件
int sub_int(int a,int b)
{
return a-b;
}
7.
sub/sub.h文件
#ifndef __SUB_H_
#define __SUB_H_
extern int sub_int(int a,int b);
extern float sub_float(float a,float b);
#endif
8.
总控makefile文件
CC=gcc
TARGET=test
export OBJSDIR=${shell pwd}/objs
RM=rm -f
CFLAGS= -Iadd -Isub -O2
$(TARGET):$(OBJSDIR) main.o
$(MAKE) -C add
$(MAKE) -C sub
$(CC) -o $(TARGET) $(OBJSDIR)/*.o
main.o:%.o:%.c
$(CC) -c $< -o $(OBJSDIR)/$@ $(CFLAGS) -Iadd -Isub
$(OBJSDIR):
mkdir -p $@
clean:
$(RM) -r $(TARGET) $(OBJSDIR) $(OBJSDIR)/*.o
9.
add/makefile文件
CC=gcc
OBJS=add_int.o add_float.o
RM=rm -f
CFLAGS= -Iadd -Isub -O2
all:$(OBJS)
$(OBJS):%.o:%.c
$(CC) -c $< -o $(OBJSDIR)/$@ $(CFLAGS)
clean:
$(RM) $(OBJS)
10.
sub/makefile文件
CC=gcc
OBJS=sub_int.o sub_float.o
RM=rm -f
CFLAGS= -Iadd -Isub -O2
all:$(OBJS)
$(OBJS):%.o:%.c
$(CC) -c $< -o $(OBJSDIR)/$@
clean:
$(RM) $(OBJS)
11.
注意事项:makefile中的gcc前面需要加[tab]。
”$(TARGET):$(OBJSDIR) main.o“ 依赖关系有先后顺序,自上而下,先“$(OBJSDIR)”再“main.o”.
$@是目标文件,代指上一行的冒号前的文件。
main.c文件
#include <stdio.h>
#include "add.h"
#include "sub.h"
int main(void)
{
int a=1,b=2;
float x=2.3,y=2.4;
printf("int a+b=%d\n",add_int(a,b));
printf("float x+y=%f\n",add_float(x,y));
printf("int a-b=%d\n",sub_int(a,b));
printf("float x-y=%f\n",sub_float(x,y));
return 0;
}
2.
add/add_int.c文件
int add_int(int a,int b)
{
return a+b;
}
3.
add/add_float.c文件
float add_float(float a,float b)
{
return a+b;
}
4.
add/add.h文件
#ifndef __ADD_H__
#define __ADD_H__
extern int add_int(int a,int b);
extern float add_float(float a,float b);
#endif
5.
sub/sub_float.c文件
float sub_float(float a,float b)
{
return a-b;
}
6.
sub/sub_int.c文件
int sub_int(int a,int b)
{
return a-b;
}
7.
sub/sub.h文件
#ifndef __SUB_H_
#define __SUB_H_
extern int sub_int(int a,int b);
extern float sub_float(float a,float b);
#endif
8.
总控makefile文件
CC=gcc
TARGET=test
export OBJSDIR=${shell pwd}/objs
RM=rm -f
CFLAGS= -Iadd -Isub -O2
$(TARGET):$(OBJSDIR) main.o
$(MAKE) -C add
$(MAKE) -C sub
$(CC) -o $(TARGET) $(OBJSDIR)/*.o
main.o:%.o:%.c
$(CC) -c $< -o $(OBJSDIR)/$@ $(CFLAGS) -Iadd -Isub
$(OBJSDIR):
mkdir -p $@
clean:
$(RM) -r $(TARGET) $(OBJSDIR) $(OBJSDIR)/*.o
9.
add/makefile文件
CC=gcc
OBJS=add_int.o add_float.o
RM=rm -f
CFLAGS= -Iadd -Isub -O2
all:$(OBJS)
$(OBJS):%.o:%.c
$(CC) -c $< -o $(OBJSDIR)/$@ $(CFLAGS)
clean:
$(RM) $(OBJS)
10.
sub/makefile文件
CC=gcc
OBJS=sub_int.o sub_float.o
RM=rm -f
CFLAGS= -Iadd -Isub -O2
all:$(OBJS)
$(OBJS):%.o:%.c
$(CC) -c $< -o $(OBJSDIR)/$@
clean:
$(RM) $(OBJS)
11.
注意事项:makefile中的gcc前面需要加[tab]。
”$(TARGET):$(OBJSDIR) main.o“ 依赖关系有先后顺序,自上而下,先“$(OBJSDIR)”再“main.o”.
$@是目标文件,代指上一行的冒号前的文件。