makefile的几种写法【原创】

Makefile  编写

Make  -f  makefile1 指定

如下是 本人的一点makefile学习笔记,再分享一个不错的写makefile总结的网址:

http://www.cnblogs.com/wang_yb/p/3990952.html

方式一、

同一个目录下有多个.c  .h文件

CROSS_COMPILE=arm-none-linux-gnueabi-gcc

#CC=arm-none-linux-gnueabi-gcc

TEST_RES := regDebug

objects = main.o uart.o

#下面这行表示依赖关系 表示所有的.o文件都是依赖于.c

#  [email protected]是目标%.o

%.o:%.c

        arm-none-linux-gnueabi-gcc -c $< -o [email protected]

$(TEST_RES): $(objects)

        #$(CC) $^ -o [email protected]

        $(CROSS_COMPILE) $^ -o [email protected]

.PHONY: clean

clean:

        rm -rf .*.cmd *.o *.mod.c  .tmp_versions Module.symvers .Makefile.swp $(TEST_RES)

方式二、

同一个目录下有多个.c  .h文件

CC=arm-none-linux-gnueabi-gcc

TEST_RES := regDebug

objects = main.o uart.o

$(TEST_RES): $(objects)

        $(CC) $^ -o [email protected]

.PHONY: clean

clean:

        rm -rf .*.cmd *.o *.mod.c  .tmp_versions Module.symvers .Makefile.swp $(TEST_RES)

方法三、

将编译生成的中间文件放在obj中,编译生成的可执行文件放在bin目录下

TEST_RES := bin/regDebug

objects = ./obj/main.o
                   ./obj/uart.o
./obj/%.o:%.c

        $(CC) -c $< -o [email protected]

$(TEST_RES): $(objects)

        $(CC) $^ -o [email protected]  

.PHONY: clean

clean:

        rm -rf  .*.cmd *.o *.mod.c  .tmp_versions Module.symvers .Makefile.swp $(TEST_RES)

        rm -rf  $(objects)

方法四、

用OBJDIR替换了路径

OBJDIR=obj

TEST_RES := bin/regDebug

objects = $(OBJDIR)/main.o
                   $(OBJDIR)/uart.o

$(OBJDIR)/%.o:%.c

        $(CC) -c $< -o [email protected]

$(TEST_RES): $(objects)

        $(CC) $^ -o [email protected]

.PHONY: clean

clean:

        rm -rf  .*.cmd *.o *.mod.c  .tmp_versions Module.symvers .Makefile.swp $(TEST_RES)

        rm -rf  $(objects)

方法五、

将uart.c和uart.h放在package目录下

CC=arm-none-linux-gnueabi-gcc

INCLUDDIR=-I package

OBJDIR=obj

TEST_RES := bin/regDebug

objects = $(OBJDIR)/main.o
                   $(OBJDIR)/uart.o

$(OBJDIR)/%.o:%.c

        $(CC) $(INCLUDDIR) -c $< -o [email protected]

$(OBJDIR)/%.o:./package/%.c

        $(CC) $(INCLUDDIR) -c $< -o [email protected]

$(TEST_RES): $(objects)

        $(CC) $^ -o [email protected]

.PHONY: clean

clean:

        rm -rf  .*.cmd *.o *.mod.c  .tmp_versions Module.symvers .Makefile.swp $(TEST_RES)

        rm -rf  $(objects)

方法六、

CC=arm-none-linux-gnueabi-gcc

INCLUDDIR=-I package

OBJDIR=obj

TEST_RES := bin/regDebug

OBJECTS = $(OBJDIR)/main.o

-include ./package/obj.mk

$(OBJDIR)/%.o:%.c

        $(CC) $(INCLUDDIR) -c $< -o [email protected]

$(OBJDIR)/%.o:./package/%.c

        $(CC) $(INCLUDDIR) -c $< -o [email protected]

$(TEST_RES): $(OBJECTS)

        $(CC) $^ -o [email protected]

.PHONY: clean

clean:

        rm -rf  .*.cmd *.o *.mod.c  .tmp_versions Module.symvers .Makefile.swp $(TEST_RES)

        rm -rf  $(OBJECTS)

 

obj.mk

OBJECTS += ./obj/uart.o

方法七、

把所有头文件都放在include目录下

CC=arm-none-linux-gnueabi-gcc

INCLUDDIR=-I include

OBJDIR=obj

TEST_RES := bin/regDebug

OBJECTS = $(OBJDIR)/main.o

-include ./package/obj.mk

$(OBJDIR)/%.o:%.c

        $(CC) $(INCLUDDIR) -c $< -o [email protected]

$(OBJDIR)/%.o:./package/%.c

        $(CC) $(INCLUDDIR) -c $< -o [email protected]

$(TEST_RES): $(OBJECTS)

        $(CC) $^ -o [email protected]

.PHONY: clean

clean:

        rm -rf  .*.cmd *.o *.mod.c  .tmp_versions Module.symvers .Makefile.swp $(TEST_RES)

        rm -rf  $(OBJECTS)

方法八、

 

#CC=arm-none-linux-gnueabi-gcc

#INCLUDDIR=-I include

#OBJDIR=obj

-include rules.mk

TEST_RES := bin/regDebug

OBJECTS = $(OBJDIR)/main.o

-include ./package/obj.mk

$(OBJDIR)/%.o:%.c

        $(CC) $(INCLUDDIR) -c $< -o [email protected]

$(OBJDIR)/%.o:./package/%.c

        $(CC) $(INCLUDDIR) -c $< -o [email protected]

$(TEST_RES): $(OBJECTS)

        $(CC) $^ -o [email protected]

.PHONY: clean

clean:

        rm -rf  .*.cmd *.o *.mod.c  .tmp_versions Module.symvers .Makefile.swp $(TEST_RES)

        rm -rf  $(OBJECTS)

rules.mk文件中

CC=arm-none-linux-gnueabi-gcc

INCLUDDIR=-I include

OBJDIR=obj

方法九、

目录结构如下

bin下为可执行文件

include 下为头文件

obj 下为编译的中间文件

package下为各种c文件

根目录下makefile

-include rules.mk

TEST_RES := bin/regDebug

OBJECTS = $(OBJDIR)/main.o

-include ./package/obj.mk

$(OBJDIR)/%.o:%.c

$(CC) $(INCLUDDIR) -c $< -o [email protected] -std=gnu99

$(OBJDIR)/%.o:./package/%.c

$(CC) $(INCLUDDIR) -c $< -o [email protected] -std=gnu99

$(TEST_RES): $(OBJECTS)

$(CC) $^ -o [email protected] -lpthread -std=gnu99

chmod a+x [email protected]

.PHONY: clean

clean:

rm -rf  .*.cmd *.o *.mod.c  .tmp_versions Module.symvers .Makefile.swp $(TEST_RES)

rm -rf  $(OBJECTS)

根目录下 rules.mk:

CC=arm-none-linux-gnueabi-gcc

INCLUDDIR=-I include

OBJDIR=obj

package目录下 obj.mk

OBJECTS += ./obj/uart.o \

./obj/Console.o \

./obj/reg_data.o \

./obj/func.o \

./obj/run.o \

./obj/revDataOne.o

如有转载请注明出处

新浪博客:http://blog.sina.com.cn/u/2049150530
博客园:http://www.cnblogs.com/sky-heaven/
知乎:http://www.zhihu.com/people/zhang-bing-hua

时间: 2024-10-18 03:05:35

makefile的几种写法【原创】的相关文章

单例模式(下)---聊一聊单例模式的几种写法

在上一篇文章 单例模式(上)--如何优雅地保证线程安全问题中,我们采取了懒汉式写法来写我们的单例模式,并且重点讲解了懒汉式中线程安全的问题.这篇我们来讲讲单例模式中的其他几种写法. 上篇文章中,方法和变量的声明都忘了加上"static"的声明,这里提醒一下. 懒汉式 懒汉式在上节我们已经讲过了,直接给出代码: public class Singleton { private static volatile Singleton instance = null; private Singl

一维数组的三种写法

/** *一维 数组的几种写法 * 记住:①数组的左边不能有数字 *   ②数组的右边既然初始化了数组,那么就要赋值 */ //一维数组的标准格式 String[] arr1 = new String[]{"bo","li","jian"}; //上面的简写格式 String[] arr2 = {"bo","li","jian"}; //初始化容量 String[] arr3 = new

Android点击事件的四种写法

Android点击事件的四种写法 一.Android点击事件的四种写法 1.点击事件的第一种写法 .  写一个内部类.实现点击事件的接口 bt.setOnClickListener(new MyButtonListener()); 2.点击事件的第二种写法,匿名内部类 bt.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { callPhone(); } }); 3.点击事件的第三种

for循环的两种写法

教程 (https://tour.golang.org/methods/21) 里的 for 是这样写的: 其中 for 语句可以改写如下: for n, err := r.Read(b); err != io.EOF; n, err = r.Read(b) { fmt.Printf("n = %v err = %v b = %v\n", n, err, b) fmt.Printf("b[:n] = %q\n", b[:n]) } (当然,golang 里的 for

全面理解Javascript闭包和闭包的几种写法及用途

一.什么是闭包和闭包的几种写法和用法                                                       1.什么是闭包 闭包,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.闭包的特点: 1. 作为一个函数变量的一个引用,当函数返回时,其处于激活状态. 2. 一个闭包就是当一个函数返回时,一个没有释放资源的栈区. 简单的说,Javascript允许使用内部函数---即函数定义和函数表

Android Listener侦听的N种写法

Android中,View的Listener方法,在是否使用匿名类匿名对象时,有各种不同的写法. OnClickListener和其他Listener方法一样,都是View类的接口,重载实现后就能使用,其接口定义如下: [java] view plaincopyprint? public interface OnClickListener { /** * Called when a view has been clicked. * * @param v The view that was cli

CSU - 1356 Catch(dfs染色两种写法,和hdu4751比较)

Description A thief is running away! We can consider the city where he locates as an undirected graph in which nodes stand for crosses and edges stand for streets. The crosses are labeled from 0 to N–1. The tricky thief starts his escaping from cross

Android点击事件(click button)的四种写法

在学习android开发和测试的时候发现不同的人对于click事件的写法是不一样的,上网查了一下,发现有四种写法,于是想比较一下四种方法的不同 第一种方法:匿名内部类 代码: package com.zdx.testdemo1; import javax.security.auth.PrivateCredentialPermission; import android.app.Activity;import android.os.Bundle;import android.view.Menu;i

javascript数组去重算法-----4(另一种写法)

1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>javascript数组去重算法-----3</title> 6 </head> 7 <body> 8 <script> 9 var arr = [1,1,2,2,3,2,2,3,3,1,1,4,4,5