手把手教你写makefile【原创】

简介:

Makefile  编写

 

Make  -f  makefile1 指定

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

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

Makefile  $@, $^, $< 
$@  表示目标文件
$^  表示所有的依赖文件
$<  表示第一个依赖文件
$?  表示比目标还要新的依赖文件列表

 

复制代码
方式一、

同一个目录下有多个.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
#  $@是目标%.o
%.o:%.c
        arm-none-linux-gnueabi-gcc -c $< -o $@

$(TEST_RES): $(objects)
        #$(CC) $^ -o $@
        $(CROSS_COMPILE) $^ -o $@       

.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 $@       

.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 $@

$(TEST_RES): $(objects)
        $(CC) $^ -o $@  

.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 $@

$(TEST_RES): $(objects)
        $(CC) $^ -o $@       

.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 $@

$(OBJDIR)/%.o:./package/%.c
        $(CC) $(INCLUDDIR) -c $< -o $@

$(TEST_RES): $(objects)
        $(CC) $^ -o $@
      
.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 $@

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

        $(CC) $(INCLUDDIR) -c $< -o $@

$(TEST_RES): $(OBJECTS)

        $(CC) $^ -o $@

.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 $@

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

        $(CC) $(INCLUDDIR) -c $< -o $@

$(TEST_RES): $(OBJECTS)

        $(CC) $^ -o $@

.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 $@

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

        $(CC) $(INCLUDDIR) -c $< -o $@

$(TEST_RES): $(OBJECTS)

        $(CC) $^ -o $@

.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

         ( C C ) (INCLUDDIR) -c  < o @ -std=gnu99

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

         ( C C ) (INCLUDDIR) -c  < o @ -std=gnu99

( T E S T R E S ) : (OBJECTS)

         ( C C ) ^ -o $@ -lpthread -std=gnu99

        chmod a+x $@

.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

方法十、

 

obj-m := driver.o
MAKEOPT := \
ARCH="arm" \
CROSS_COMPILE="arm-none-linux-gnueabi-"

 

ARM_LINUX_KERNEL := "/home/zhangbh/firmware/build_dir/linux-brcm5830_sxxx-prolin2/linux-3.6.5/"

PWD = $(shell pwd)

all:
( M A K E ) (MAKEOPT) -C  ( A R M L I N U X K E R N E L ) M = (PWD) modules

clean:
rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions Module.symvers .Makefile.swp modules.order

 

方法十一、

L_DIR=-L /home/zhangbh/new/firmware/staging_dir/target-arm-none-linux-gnueabi/usr/lib
I_DIR=-I /home/zhangbh/new/firmware/staging_dir/target-arm-none-linux-gnueabi/usr/include/

L_FLAG=-losal \
-lcbinder \
-ljpeg \
-lfreetype \
-lpng \
-lz \
-lpthread \
-lrt \
-lcrypt \
-lssl \
-lcrypto \
-lts \
-lprop \
-lcutils \
-lxui

VBS_t:VBS.c
arm-none-linux-gnueabi-gcc -o  @ ( I D I R ) (L_DIR) $(L_FLAG)

 

方法十三、

obj-m:=demo.o

ARCH:=arm
CROSS_COMPILE:=/home/zhangbh/cygnus/3.5.4-RC2/iproc/buildroot/buildroot/host/usr/bin/
KERNEL_HEADERS:=/home/zhangbh/cygnus/3.5.4-RC2/iproc/kernel/linux-3.6.5

build:kernel_modules
kernel_modules:
make ARCH= ( A R C H ) C R O S S C O M P I L E = (CROSS_COMPILE) -C  ( K E R N E L H E A D E R S ) M = (CURDIR) modules

clean:
make ARCH= ( A R C H ) C R O S S C O M P I L E = (CROSS_COMPILE) -C  ( K E R N E L H E A D E R S ) M = (CURDIR) clean

 

方式十四、 驱动和应用反汇编调试 objdump

obj-m := kmod-demo1.o
MAKEOPT := ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
#CFLAGS := -O2 -DMODULE -D__KERNEL__  W A R N {INCLUDE} 
ARM_LINUX_KERNEL := /home/zhangbh/Prolin_os/si/Prolin/firmware_cygnus/build_dir/linux-brcm5830_sxxx-prolin2/linux-3.6.5
ccflags-y :=-g
PWD = $(shell pwd)

all:
( M A K E ) (MAKEOPT) -C  ( A R M L I N U X K E R N E L ) M = (PWD) modules

.PHONY: clean

clean:
rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions Module.symvers .Makefile.swp modules.order

复制代码

 

复制代码
info 可以用来在makefile中打印

include $(TOPDIR)/.config 
$(info tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt)
$(info $(CONFIG_ENABLE_AA))


include $(TOPDIR)/.config 
ifeq ($(CONFIG_ENABLE_PCI),y)
EXTRA_CFLAGS += -DCONFIG_ENABLE_PCI
endif
 

 ifeq ($(CONFIG_ENABLE_PCI),y)

EXTRA_CPPFLAGS += -DCONFIG_ENABLE_PCI
endif

 编译的时候可以在error时停下

34 #ifdef CONFIG_ENABLE_PCI
35 #error "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
36 printk("\r\n\r\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa===============\r\n\r\n");
37 #endif
复制代码

 

 如有转载请注明出处

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

 












本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sky-heaven/p/4652804.html,如需转载请自行联系原作者

相关文章
|
7月前
|
编译器 Shell Linux
Makefile(3)进阶
Makefile(3)进阶
53 0
|
7月前
|
Linux 编译器 C语言
Linux应用开发基础知识——Makefile 的使用(二)
Linux应用开发基础知识——Makefile 的使用(二)
266 0
Linux应用开发基础知识——Makefile 的使用(二)
|
Java 编译器 Linux
Makefile教程(入门介绍)
Makefile教程(入门介绍)
116 0
|
3月前
|
API Windows
[原创]MASM32新手指南
[原创]MASM32新手指南
|
6月前
|
Unix Linux 编译器
程序与技术分享:cmake使用方法详解
程序与技术分享:cmake使用方法详解
63 0
|
算法 Linux C++
[笔记]CMake学习
[笔记]CMake学习
|
存储 运维 编译器
Linux运维:makefile
Linux运维:makefile
107 0
|
Shell
Makefile 使用(2):基础知识整理
本文主要介绍一些makefile中常用的一些基础知识。涉及make使用、即时变量和延时变量、导出变量、伪目标以及相关函数。
114 0
|
Python
原创 寒假python学习
原创 寒假python学习
81 0
|
算法 SEO 搜索推荐
如何写好高质量的原创文章?
随着百度算法的不断升级,百度越来越重视原创文章了,但是原创文章可不单单是用工具查询的相似度为0的文章,更多的应当是可以解决用户需求,能够引发用户阅读兴趣的文章,即看了这篇文章还想下次再来你的网站进行学习。
1252 0