• 自己是个菜鸟 自己查找的简单的适合初学的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中。

    文件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 ",a+b);

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

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

           printf("float x-y IS:%f ",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    #这里指定主函数中包含文件的搜索路径

    //参考g++ -g -o test test.cpp -I./mysql/linux_x86_64bit/include -L . -lmysql

    #清理规则

    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(g++)

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

  • 相关阅读:
    顺序程序设计03 零基础入门学习C语言09
    数据类型,运算符和表达式05 零基础入门学习C语言06
    顺序程序设计01 零基础入门学习C语言07
    顺序程序设计01 零基础入门学习C语言07
    顺序程序设计02 零基础入门学习C语言08
    数据类型,运算符和表达式05 零基础入门学习C语言06
    分支程序设计01 零基础入门学习C语言10
    分支程序设计01 零基础入门学习C语言10
    VC++ 实现线程注入
    ISV 客户博客系列:Minitab通过Windows Azure推出云端Qeystone
  • 原文地址:https://www.cnblogs.com/cy568searchx/p/3336924.html
Copyright © 2020-2023  润新知