Makefile的使用技巧

原创 2010年06月01日 17:56:00

Makefile的使用技巧

1、 makefile中的两种变量

Ø         COMPILE=$(CC)$(CFLAGS) -c

在使用COMPILE的时候,CCCFLAGS才会展开,并且是每次都会展开,所以当定义COMPILE的时候,即使CCCFLAGS还没有值,都没有关系,只要当使用COMPILE时,CCCFLAGS有值就可以了。

OBJS=$(wildcard *.o)

OBJS每次在引用的时候,获取目标文件的列表,每一次可能都不同,并且每次计算通配符导致运行速度变慢。

 

Ø         COMPILE=$(CC)$(CFLAGS) -c

在执行这行后,在使用COMPILE时,其值不会再变化,即使CCCFLAGS变化了。当然可以显示的赋值给COMPILE来改变其值。

 

2、 使用函数

Ø         wildcard

SRCS := $(wildcard *.c)

获得所有的C文件列表

 

Ø         patsubst

OBJS := $(patsubst %.c,%.o,$( wildcard *.c ))

获得所有c文件对应的o文件列表

 

3、 特殊符号

%.o: %.c

        gcc -Wall -c -o $@ $<

将所有的C文件编译成O文件。

 

4、 两种编译方式

Ø         gcc -o myprogram 1.c 2.c

1.c2.c编译成myprogram程序。

 

Ø         gcc -c -o 1.o 1.c

1.c编译成O文件。

 

5、 依赖性计算

gcc -M init.c > init.d

将所有的依赖文件(包括系统文件)写入d文件

gcc -MM init.c > init.d

将不包括系统文件的依赖文件写入d文件

 

6、 智能makefile模板

# Lines starting with the pound sign are comments.

#

# This is one of two options you might need to tweak.

 

EXECUTABLE = myprogram

 

# You can modify the below as well, but probably

# won't need to.

#

 

# CC is for the name of the C compiler. CPPFLAGS denotes pre-processor

# flags, such as -I options. CFLAGS denotes flags for the C compiler.

# CXXFLAGS denotes flags for the C++ compiler. You may add additional

# settings here, such as PFLAGS, if you are using other languages such

# as Pascal.

 

CC = gcc

CPPFLAGS =

CFLAGS = -Wall -O2

CXXFLAGS = $(CFLAGS)

COMPILE = $(CC) $(CPPFLAGS) $(CFLAGS) -c

 

SRCS := $(wildcard *.c)

OBJS := $(patsubst %.c,%.o,$(SRCS))

DEPS := $(patsubst %.c,%.d,$(SRCS))

 

# "all" is the default target. Simply make it point to myprogram.

 

all: $(EXECUTABLE)

 

# Define the components of the program, and how to link them together.

# These components are defined as dependencies; that is, they must be

# made up-to-date before the code is linked.

 

#最终的二进制程序依赖于d文件和o文件

$(EXECUTABLE): $(DEPS) $(OBJS)  

       $(CC) -o $(EXECUTABLE) $(OBJS)

 

# Specify that the dependency files depend on the C source files.

#生成d文件,d文件内容包括两行,o文件的依赖关系,d文件的依赖关系

%.d: %.c

       $(CC) -M $(CPPFLAGS) $< > $@

       $(CC) -M $(CPPFLAGS) $< | sed s///.o/.d/ >> $@

 

# Specify that all .o files depend on .c files, and indicate how

# the .c files are converted (compiled) to the .o files.

#c文件生成o文件

%.o: %.c

       $(COMPILE) -o $@ $<

 

#删除四类文件

clean:

       -rm $(OBJS) $(EXECUTABLE) $(DEPS) *~

 

explain:

       @echo "The following information represents your program:"

       @echo "Final executable name: $(EXECUTABLE)"

       @echo "Source files:     $(SRCS)"

       @echo "Object files:     $(OBJS)"

       @echo "Dependency files:   $(DEPS)"

 

depend: $(DEPS)

       @echo "Dependencies are now up-to-date."

 

#d文件内容导入makefile

-include $(DEPS)

特点:

Ø         没有出现任何一个具体的文件名

Ø         采用依赖性文件确定依赖关系,并最后通过include将依赖关系导入

Ø         最终的二进制程序,不仅仅依赖于o文件,还依赖于d文件

 

具体见example4

 

7、 级联嵌套makefile

# Lines starting with the pound sign are comments.

#

# This is one of two options you might need to tweak.

 

EXECUTABLE = myprogram

 

# You can modify the below as well, but probably

# won't need to.

#

 

# CC is for the name of the C compiler. CPPFLAGS denotes pre-processor

# flags, such as -I options. CFLAGS denotes flags for the C compiler.

# CXXFLAGS denotes flags for the C++ compiler. You may add additional

# settings here, such as PFLAGS, if you are using other languages such

# as Pascal.

 

CC = gcc

CPPFLAGS =

CFLAGS = -Wall -O2

CXXFLAGS = $(CFLAGS)

COMPILE = $(CC) $(CPPFLAGS) $(CFLAGS) -c

 

SRCS := $(wildcard *.c)

OBJS := $(patsubst %.c,%.o,$(SRCS))

DEPS := $(patsubst %.c,%.d,$(SRCS))

 

DIRS= input format

 

# "all" is the default target. Simply make it point to myprogram.

 

all: $(EXECUTABLE)

 

subdirs:

       @for dir in $(DIRS); do $(MAKE) -C $$dir; done

 

# Define the components of the program, and how to link them together.

# These components are defined as dependencies; that is, they must be

# made up-to-date before the code is linked.

 

$(EXECUTABLE): subdirs $(DEPS) $(OBJS)

       $(CC) -o $(EXECUTABLE) $(OBJS)

 

# Specify that the dependency files depend on the C source files.

 

%.d: %.c

       $(CC) -M $(CPPFLAGS) $< > $@

       $(CC) -M $(CPPFLAGS) $< | sed s///.o/.d/ >> $@

 

# Specify that all .o files depend on .c files, and indicate how

# the .c files are converted (compiled) to the .o files.

 

%.o: %.c

       $(COMPILE) -o $@ $<

 

clean:

       -rm $(OBJS) $(EXECUTABLE) $(DEPS) *~

       @for dir in $(DIRS); do $(MAKE) -C $$dir clean; done

 

explain:

       @echo "The following information represents your program:"

       @echo "Final executable name: $(EXECUTABLE)"

       @echo "Source files:     $(SRCS)"

       @echo "Object files:     $(OBJS)"

       @echo "Dependency files:   $(DEPS)"

       @echo "Subdictionary: $(DIRS)"

 

depend: $(DEPS)

       @for dir in $(DIRS); do $(MAKE) -C $$dir; done

       @echo "Dependencies are now up-to-date."

 

-include $(DEPS)

这是顶层makefile相对于标准智能模板进行的修改,inputformat中的makefile为标准的模块。

Linux编程——makefile编写技巧大全

1. Makefile 简介 本来想自己写一些makefile的东西,但是在网上查资料时发现这篇文章,感觉写得很详细,排版也很不错,现转载过来。特此声明。 原文地址:http://www.c...
  • bad_good_man
  • bad_good_man
  • 2015-11-24 14:47:57
  • 4211

Makefile的使用技巧

Makefile的使用技巧1、makefile中的两种变量Ø         COMPILE=$(CC)$(CFLAGS) -c在使用COMPILE的时候,CC和CFLAGS才会展开,并且是每次都会展...
  • braveyly
  • braveyly
  • 2010-06-01 17:56:00
  • 1357

Makefile中的几个调试方法

1,使用info/warning/error增加调试信息 方法1: $(info, "here add the debug info")            但是此不能打印出.mk的行号 方法2...
  • wlqingwei
  • wlqingwei
  • 2015-03-19 16:22:52
  • 12389

Makefile经典教程(掌握这些足够)

makefile很重要       什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professio...
  • ruglcc
  • ruglcc
  • 2012-07-31 15:28:42
  • 494447

Makefile.am技巧

如何加make check支持在Makefile.am中加TESTS变量,如果一个测试必定通不过,把这个测试加到 XFAIL_TESTS变量中.如果要执行编译出来的程序,可以加check_PROGR...
  • ufwt
  • ufwt
  • 2006-12-02 10:33:00
  • 542

makefile技巧:在makefile中打印

1.在makefile中增加打印。 LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional ...
  • hhdsyxwei
  • hhdsyxwei
  • 2016-09-08 14:11:10
  • 2167

Android实战技巧之三十六:Makefile快速入门

目标通过一篇文章的介绍达到能够编写简单Makefile以及能够看懂普通的Makefile之目的。make简介make是一个老牌的构建(build)工具,1970年问世以来已经度过了45年的时光而魅力不...
  • lincyang
  • lincyang
  • 2015-06-13 13:12:20
  • 4114

makefile教程

一、makefile简介定义: makefile定义了软件开发过程中,项目工程编译链、接接的方法和规则。产生: 由IDE自动生成或者开发者手动书写。作用: Unix(MAC OS、Solaris)和L...
  • K346K346
  • K346K346
  • 2015-12-18 10:25:03
  • 2657

Android系统常用Makefile技巧

一、重用Android.mk写法 1.源码编译一个so库libChannelSwitchDetector.so LOCAL_PATH:= $(call my-dir) include $(CLEAR...
  • tankai19880619
  • tankai19880619
  • 2014-12-17 15:16:26
  • 1345
收藏助手
不良信息举报
您举报文章:Makefile的使用技巧
举报原因:
原因补充:

(最多只允许输入30个字)