Makefile的编写

工程中的代码分别存放在add/add_int.c、add/add_float.c、add/add.h、sub/sub_int.c、sub/sub_float.c、sub/sub.h、main.c中。

Makefile的一个具体的实例

 

文件main.c

#include <stdio.h>

#include "add.h"            

#include "sub.h"

intmain(void)

{

      int input = 0;

      int a = 10, b = 12;

      float x= 1.23456,y = 9.87654321;

      

      printf("int a+b IS:%d\n",a+b);

      printf("int a-b IS:%d\n",a-b);

      printf("float x+y IS:%f\n",x+y);

      printf("float x-y IS:%f\n",x-y);

 

 

      return 0;      

}

加操作 

#ifdef __ADD_H__

#define __ADD_H__

extern int add_int(int a, int b);

extern float add_float(float a, float b);

#endif  

float add_float(float a, float b)

{

      return a+b;  

 

intadd_int(int a, int b)

{

      return a+b;  

}

减操作

#ifdef __ADD_H__

#define __ADD_H__

extern float sub_float(float a, float b);

extern int sub_int(int a, int b);

#endif 

float sub_float(float a, float b)

{

      return a-b;   

intsub_int(int a, int b)

{

      return a-b;   

}

命令行编译程序:

#gcc-c add/add_int.c -o add/add_int.o     #生成add_int.o目标函数

#gcc-c add/add_float.c -o add/add_float.o   #生成add_float.o目标函数

#gcc-c sub/sub_int.c -o sub/sub_int.o      #生成sub_int.o目标函数

#gcc-c sub/sub_float.c -o sub/sub_float.o    #生成sub_float.o目标函数

#gcc-c main.c -o main.o                 #生成main.o目标函数

#gcc-o casu add/add_int.o add/add_float.o sub/sub_int.o sub/sub_float.omain.o

#链接生成cacu

多文件的makefile:

#生成casu,“;”右边为目标

casu:add_int.o add_float.o sub_int.o sub_float.omain.o

      gcc -o casu add/add_int.o add/add_float.o \          #\为连接符

                    sub/sub_int.o sub/sub_float.o main.o    

#生成add_int.o的规则,将add_int.c编译生成目标文件add_int.o

add_int.o:add/add_int.c add/add.h

      gcc -c -o add/add_int.o add/add_int.c

#生成add_float.o的规则

add_float.o:add/add_float.c add/add.h

      gcc -c -o add/add_float.o add/add_float.c

#生成sub_int.o的规则

sub_int.o:sub/sub_int.c sub/sub.h

      gcc -c -o sub/sub_int.o sub/sub_int.c

#生成sub_float.o的规则

sub_float.o:sub/sub_float.c sub/sub.h

      gcc -c -o sub/sub_float.o sub/sub_float.c

#生成main.o的规则

main.o:main.c add/add.h sub/sub.h

      gcc -c -o main.o main.c -Iadd -Isub

      

#清理规则

clean:

      rm -f casu add/add_int.o add/add_float.o \

           sub/sub_int.o sub/sub_float.o main.o

使用自定义变量的makefile文件:

CC = gcc                                #CC定义成gcc

CFLAGES =   -Iadd -Isub -O2   #加入头文件搜索路径subaddO2为优化#目标文件

OBJS = add/add_int.o add/add_float.o \

             sub/sub_int.o sub/sub_float.o main.o

TARGET = casu                          #生成的可执行文件

RM = rm -f                              #删除的命令

$(TARGET):$(OBJS)                      #TARGET目标,需要先生成OBJS目标

      $(CC) -o $(TARGET) $(OBJS) $(CFLAGES)   #生成可执行文件

$(OBJS):%.o:%.c         #OBJS中所有扩展名为.o的文件替换成扩展名为.c的文件

      $(CC) -c $(CFLAGES) $< -o $@       #采用CFLAGS指定的选项编译生成目标文件

clean:                              #清理

      -$(RM) $(TARGET) $(OBJS)          #删除所有的目标文件和可执行文件

使用预定义变量的makefile文件:

CFLAGES =   -Iadd -Isub -O2              #编译选项

OBJS= add/add_int.o add/add_float.o \

               sub/sub_int.osub/sub_float.o main.o

TARGET = casu                         #生成的可执行文件

$(TARGET):$(OBJS)                      #TARGET目标,需要先生成OBJS目标

      $(CC) -o $(TARGET) $(OBJS)$(CFLAGES)  #生成可执行文件

$(OBJS):%.o:%.c         #OBJS中所有扩展名为.o的文件替换成扩展名为.c的文件

      $(CC) -c $(CFLAGES)$< -o $@       #采用CFLAGS指定的选项编译生成目标文件

clean:                              #清理

      -$(RM) $(TARGET)$(OBJS)          #删除所有的目标文件和可执行文件

使用自动变量的makefile文件:

CFLAGES =   -Iadd -Isub -O2              #编译选项

OBJS= add/add_int.o add/add_float.o \

               sub/sub_int.osub/sub_float.o main.o

TARGET = casu                          #生成的可执行文件

$(TARGET):$(OBJS)                      #TARGET目标,需要先生成OBJS目标

      $(CC) -o  $@  $^$(CFLAGES)         #生成可执行文件

$(OBJS):%.o:%.c         #OBJS中所有扩展名为.o的文件替换成扩展名为.c的文件

      $(CC) -c $<  $(CFLAGES) -o$@     #采用CFLAGS指定的选项编译生成目标文件

clean:                              #清理

      -$(RM) $(TARGET) $(OBJS)          #删除所有的目标文件和可执行文件

使用搜索路径的makefile文件:

CFLAGES =   -Iadd -Isub -O2  

OBJSDIR = .objs

VPATH = add:sub:.        

OBJS= add_int.o add_float.o sub_int.o sub_float.o main.o

TARGET = casu                          

$(TARGET):$(OBJSDIR) $(OBJS)     #先检测OBJSDIROBJS依赖项是否存在                

      $(CC) -o $(TARGET) $(OBJSDIR)/*.o $(CFLAGES)

 #OBJSDIR目录中所有的.o文件链接成casu          

$(OBJS):%.o:%.c         

      $(CC) -c $< $(CFLAGES) -o $(OBJSDIR)/$@ #生成目标文件,存放在OBJSDIR目录中

$(OBJSDIR):

      mkdir -p ./$@           #建立目录,-p选项可以忽略父目录不存在的错误

clean:                                

      -$(RM) $(TARGET)       #删除casu

      -$(RM) $(OBJSDIR)/*.o   #删除OBJSDIR目录下的所有.o文件

使用自动推导规则的makefile:

CFLAGS = -Iadd -Isub -O2        # 用户自定义变量

VPATH=add:sub               #搜索路径

OBJS= add_int.o add_float.o sub_int.o sub_float.o main.o

TARGET = cacu

$(TARGET):$(OBJS)            #OBJS依赖项的规则自动生成

      $(CC) -o $(TARGET) $(OBJS) $(CFLAGS)    #链接文件

clean:

      -$(RM) $(TARGET)        #-”表示当前操作失败时不报错,命令继续执行

      -$(RM) $(OBJS)

使用函数的makefile文件:

CC =gcc                              #CC定义成gcc

VPATH =add:sub

CFLAGES =   -Iadd -Isub -O2    #加入头文件搜索路径subaddO2为优化#目标文件

TARGET = casu                        #生成的可执行文件

DIRS= sub add .                    #DIRS字符串的值为目录addsub和当前目录

FILES = $(foreach dir, $(DIRS),$(wildcard$(dir)/*.c))  #查找所用目录下的.c文件

OBJS = $(patsubst %.c,%.o,$(FILES))          #.c替换成.o

$(TARGET):$(OBJS)                       #TARGET目标,需要先生成OBJS目标

      $(CC) -o $(TARGET) $(OBJS) $(CFLAGES)  #生成可执行文件

clean:                                 #清理

      -$(RM) $(TARGET) $(OBJS)             #删除所有的目标文件和可执行文件

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值