工程中的代码分别存放在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    #这里指定主函数中包含文件的搜索路径

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

自己是个菜鸟 自己查找的简单的适合初学的Makefile的更多相关文章

  1. 菜鸟学Android编程——简单计算器《一》

    菜鸟瞎搞,高手莫进 本人菜鸟一枚,最近在学Android编程,网上看了一些视频教程,于是想着平时手机上的计算器应该很简单,自己何不尝试着做一个呢? 于是就冒冒失失的开撸了. 简单计算器嘛,功能当然很少 ...

  2. 菜鸟试做GUI简单数据库查询界面 python+tkinter+mysql

    一.准备工作: 1.安装mysql3.7,创建一个test数据库,创建student表,创建列:(列名看代码),创建几条数据 (以上工作直接用navicat for mysql工具完成) 二.代码: ...

  3. 如何查找并简单分析core文件

    当系统发生coredump时,通常需要通过分析core文件来定位问题所在,但实际工作中,有时却发现core 文件找不到,或者core文件被删除了. 一.core文件没有生成 KINGBASE core ...

  4. 二分查找c++简单模板

    //数组a[]中有n各元素,已经按升序排序,待查找的元素x sort(a,a+n); //升序排序 template<class Type> int BinarySearch(Type a ...

  5. scrapy爬虫简单案例(简单易懂 适合新手)

    爬取所有的电影名字,类型,时间等信息 1.准备工作 爬取的网页 https://www.ddoutv.com/f/27-1.html 创建项目 win + R 打开cmd输入 scrapy start ...

  6. 新的框架,新的感觉ASP.NET MVC 分享一个简单快速适合新手的框架

    在ASP.NET世界中摸爬滚打好几年,用过了各种框架,在最初的ASP.NET web from 到现在的MVC 在起初的经典三层,到现在的MVC  IOC  注入 . 突然发现,有些时候真不是跟风用一 ...

  7. JSON的简单书写(初学),使用Java语言反序列化

    这个适合初学者:刚刚我学习的 1.基础的"JSON"     对象是用一对大括号: 例如: {      "name":"xiaohua", ...

  8. 一个简单的编译tex的Makefile

    tex编译成pdf通常要经过以下步骤:tex-->dvi-->ps-->pdf.如果修改了tex文件想看一下效果,就要把命令重新敲一遍.虽然就几行命令,反复敲还是很烦人的.最直接的办 ...

  9. 简单的floyd——初学

     前言: (摘自https://www.cnblogs.com/aininot260/p/9388103.html): 在最短路问题中,如果我们面对的是稠密图(十分稠密的那种,比如说全连接图),计算多 ...

随机推荐

  1. javascript无缝滚动原理

    相比之下,无缝拼接能避免切换时出现空白,使用户体验更好! 无缝滚动原理: 制作一个双胞胎,内容跟主体内容一致,样式一致,如果横向排列则并排,当切换的时候,就可以弥补主体空白的地方,其他按普通循环操作即 ...

  2. hdu1269迷宫城堡 (强连通Tarjan+邻接表)

    Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每一个通道都是单向的,就是说 ...

  3. 电子书mobi的格式详解

    https://wiki.mobileread.com/wiki/MOBI#Format Like PalmDOC, the Mobipocket file format is that of a s ...

  4. linux有用技巧:使用ntfs-3g挂载ntfs设备

    1.几种文件系统的比較 (1)在linux系统中支持一下文件系统:               Ext2         第二扩展文件系统(简称 ext2 或者 ext2) 非常多年前就已经成为 GN ...

  5. Spring核心之IoC——依赖注入

    在J2EE开发平台中,Spring是一种优秀的轻量级企业应用解决方案.Spring倡导一切从实际出发,它的核心技术就是IOC(控制反转)和AOP(面向切面编程)技术.本文用的Spring版本为spri ...

  6. DCM4CHEE概述

    DCM4CHEE构建概述: 所谓“磨刀不误砍柴工”,通过上面的知识普及,大致梳理了开源项目的应用流程.在下一篇博文开始正式介绍DCM4CHEE构建过程之前,先对DCM4CHEE进行一个简单的概述. d ...

  7. 给文件夹添加Everyone用户

    DOC命令 C# code 1. cacls C:dming /g everyone:f /e /t 这样可以添加 2. cacls C:Program Files客友软件 /g everyone:f ...

  8. 关于vs2013调试的偶然错误发现与总结(vs2013的承载进程)---ShinePans

    当项目的属性选择为 启用 vs2013承载进程 或出现一下错误: 尝试运行项目时出错:未能加载文件或程序集"GroupBoxTest" 或它的某一个依赖项.给定程序集名称" ...

  9. JS-获取图片地址

    var url=document.getElementById("a001").src; 或var url=document.getElementById("a001&q ...

  10. STL - 算法 - 普通拷贝

    list<, , , , , , , , }; vector<int> coll2; cout << "** collection 1: **" &l ...