自己是个菜鸟 自己查找的简单的适合初学的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\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的更多相关文章
- 菜鸟学Android编程——简单计算器《一》
菜鸟瞎搞,高手莫进 本人菜鸟一枚,最近在学Android编程,网上看了一些视频教程,于是想着平时手机上的计算器应该很简单,自己何不尝试着做一个呢? 于是就冒冒失失的开撸了. 简单计算器嘛,功能当然很少 ...
- 菜鸟试做GUI简单数据库查询界面 python+tkinter+mysql
一.准备工作: 1.安装mysql3.7,创建一个test数据库,创建student表,创建列:(列名看代码),创建几条数据 (以上工作直接用navicat for mysql工具完成) 二.代码: ...
- 如何查找并简单分析core文件
当系统发生coredump时,通常需要通过分析core文件来定位问题所在,但实际工作中,有时却发现core 文件找不到,或者core文件被删除了. 一.core文件没有生成 KINGBASE core ...
- 二分查找c++简单模板
//数组a[]中有n各元素,已经按升序排序,待查找的元素x sort(a,a+n); //升序排序 template<class Type> int BinarySearch(Type a ...
- scrapy爬虫简单案例(简单易懂 适合新手)
爬取所有的电影名字,类型,时间等信息 1.准备工作 爬取的网页 https://www.ddoutv.com/f/27-1.html 创建项目 win + R 打开cmd输入 scrapy start ...
- 新的框架,新的感觉ASP.NET MVC 分享一个简单快速适合新手的框架
在ASP.NET世界中摸爬滚打好几年,用过了各种框架,在最初的ASP.NET web from 到现在的MVC 在起初的经典三层,到现在的MVC IOC 注入 . 突然发现,有些时候真不是跟风用一 ...
- JSON的简单书写(初学),使用Java语言反序列化
这个适合初学者:刚刚我学习的 1.基础的"JSON" 对象是用一对大括号: 例如: { "name":"xiaohua", ...
- 一个简单的编译tex的Makefile
tex编译成pdf通常要经过以下步骤:tex-->dvi-->ps-->pdf.如果修改了tex文件想看一下效果,就要把命令重新敲一遍.虽然就几行命令,反复敲还是很烦人的.最直接的办 ...
- 简单的floyd——初学
前言: (摘自https://www.cnblogs.com/aininot260/p/9388103.html): 在最短路问题中,如果我们面对的是稠密图(十分稠密的那种,比如说全连接图),计算多 ...
随机推荐
- 【spring cloud】分布式ID,雪花算法
分布式ID生成服务 参考地址:https://blog.csdn.net/wangkang80/article/details/77914849 算法描述: 最高位是符号位,始终为0,不可用. 41位 ...
- JPA入门样例(採用JPA的hibernate实现版本号)
(1).JPA介绍: JPA全称为Java Persistence API ,Java持久化API是Sun公司在Java EE 5规范中提出的Java持久化接口.JPA吸取了眼下Java持久化技术的长 ...
- OpenShift和F5的集成手册
OpenShift和F5的集成步骤,记录如下,如实际操作中有变更会再度编辑修改. 1.整体架构 使用BIG-IP作为Openshift的Router,能实现以下功能: 为Services创建BIG-I ...
- luigi框架--关于python运行spark程序
首先,目标是写个python脚本,跑spark程序来统计hdfs中的一些数据.参考了别人的代码,故用了luigi框架. 至于luigi的原理 底层的一些东西Google就好.本文主要就是聚焦快速使用, ...
- 非阻塞I/O
http://blog.163.com/tyw_andy/blog/static/1167902120099163252164/ 套接口缺省是阻塞的.这一点意味着当发出一个不能立即完成的套接口调用时, ...
- 双硬盘Win7装Ubuntu 12.04经验并解决无线网络不能使用问题
RFKill Many computer systems contain radio transmitters, including Wi-Fi, Bluetooth, and 3G devices. ...
- Open War I: 野王复活与视野,望远镜视野,近距离射击,远程狙击
Below demos For: 1- 野王复活与视野,近距离射击. 2- 野王视野之外,无法近距离射击,实现望远镜视野, 远程狙击 Share the source codes with your ...
- Hbase总结(八)Hbase中的Coprocessor
1.起因(Why HBase Coprocessor) HBase作为列族数据库最常常被人诟病的特性包含:无法轻易建立"二级索引",难以运行求和.计数.排序等操作.比方,在旧版本 ...
- android中获取某段程序的执行时间
Date startDate = new Date(System.currentTimeMillis()); 在收到设备返回数据之后添加如下语句: Date endDate = ...
- POJ 3463 Sightseeing
最短路+次短路(Dijkstra+priority_queue) 题意是要求你找出最短路的条数+与最短路仅仅差1的次短路的条数. 開始仅仅会算最短路的条数,和次短路的长度.真是给次短路条数跪了.ORZ ...