您的位置:首页 > 其它

makefile

2016-03-13 11:26 274 查看
工程中的代码分别存放在add/add_int.c、add/add_float.c、add/add.h、sub/sub_int.c、sub/sub_float.c、sub/sub.h、main.c中。



文件main.c

#include <stdio.h>

#include "add.h"

#include "sub.h"

int main(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;

}

int add_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;

}

int sub_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.o main.o

#链接生成cacu

多文件的makefile:

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

casu:add_int.o add_float.o sub_int.o sub_float.o main.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 #加入头文件搜索路径sub和add,O2为优化#目标文件

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.o
sub/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.o
sub/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) #先检测OBJSDIR和OBJS依赖项是否存在

$(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 #加入头文件搜索路径sub和add,O2为优化#目标文件

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

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

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) #删除所有的目标文件和可执行文件
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: