Chinaunix首页 | 论坛 | 博客
  • 博客访问: 158214
  • 博文数量: 66
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 20
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-23 15:21
文章分类

全部博文(66)

文章存档

2016年(66)

我的朋友

分类: LINUX

2016-04-14 23:22:24

工程中的代码分别存放在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
#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



我们先来看一些关键字:

1:VPATH 和 vpath
        VPATH = src:../headers      //它指定了两个搜索目录,“src”和“../headers”, 不过当前目录永远是第一个搜索的目录

        vpath%.h include               //指定.h类型文件的搜索路径是include
        vpath%.cpp src                  //指定.cpp类型文件的搜索路径是src


2:CFLAGS
       指定头文件(.h文件)的路径,如:CFLAGS=-I/usr/include -I/path/include。同样地,安装一个包时会在安装路径下建立一个include目录,当安装过程中出现问题时,试着把以前安装的包的include目录加入到该变量中来 


3:LIBS
        告诉链接器要链接哪些库文件,如LIBS = -lpthread -liconv




使用自定义变量的makefile文件:
CC = gcc                                #CC定义成gcc

CFLAGES =    -Iadd -Isub -O2   #加入头文件搜索路径sub和add,O2为优化#目标文件       //(add和sub是目录名字)

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)              #删除所有的目标文件和可执行文件

阅读(2666) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~