`

Makefile的使用技巧

 
阅读更多

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为标准的模块。

分享到:
评论

相关推荐

    关于C语言的MakeFile.rar_C语言_EFI_make_makefile_makefile for windows

    提供的CHM文件“关于C语言的MakeFile.CHM”很可能包含了更深入的Makefile使用技巧和EFI编程指南,而“www.pudn.com.txt”可能是发布者提供的额外信息或链接,可能指向更多相关的学习资源。 总的来说,理解和掌握...

    makefile入门

    #### 五、Makefile 使用技巧 1. **变量定义:** 在复杂的 Makefile 中,可以定义变量来存储经常使用的路径或选项,提高可读性和维护性。 ```makefile CC = cc CFLAGS = -g -Wall OBJ = main.o kbd.o command.o ...

    很不错的嵌入式makefile资料合集

    这个“很不错的嵌入式makefile资料合集”显然是为了帮助学习者深入理解并掌握在嵌入式环境下的Makefile使用技巧。下面我们将详细探讨Makefile及其在嵌入式开发中的应用。 Makefile是Unix/Linux环境中的一种自动化...

    嵌入式Linux开发详解:100ask IMX6ULL开发板使用手册

    内容概要:本文档详述了基于ARM Cortex-A7架构的100ask IMX6ULL开发板的应用开发全过程,内容覆盖开发环境搭建、常见命令介绍、Makefile使用技巧等关键点,提供了全面的操作指南和技术支持渠道,适用于初学者快速...

    Makefile使用手册.pdf

    ### Makefile使用手册知识点梳理 #### 一、Make概述 - **Make的作用**:Make是一种...以上是《Makefile使用手册》的主要知识点梳理,涵盖了从基本概念到高级技巧的各个方面,旨在帮助读者全面掌握Makefile的使用方法。

    Makefile手册_中文版.pdf

    手册内容详实,不仅覆盖了基础概念,还提供了丰富的实例和技巧,是学习和应用Makefile不可或缺的参考资料。 手册开始部分提到了阅读指南,建议读者从概览开始逐步深入,并且了解文档中的问题和BUG报告方式,从而更...

    Makefile进阶 Makefile进阶

    - **循环**:虽然 Makefile 本身不支持循环结构,但可以通过递归调用 Make 或使用 `foreach` 等技巧实现类似的逻辑。 #### 七、总结 通过以上对 Makefile 文件的深入探讨,我们可以看到 Makefile 在项目构建中的...

    跟我一起学Makefile

    《跟我一起学Makefile》是针对Linux环境下的Makefile编写技术进行深入讲解的资源集合,旨在帮助初学者和开发者快速理解和掌握Makefile的编写规则与技巧。Makefile在软件开发中扮演着重要的角色,它是自动化构建工具...

    Makefile 多目录编译Demo

    学习和掌握Makefile的多目录编译技巧对于提升开发效率至关重要。它可以避免手动跟踪和更新编译指令,尤其是在大型项目中,能够减少错误并促进团队协作。同时,了解和实践不同方法可以帮助我们选择最适合特定项目需求...

    Makefile 手册

    编写Makefile时,应遵循一些最佳实践,如保持规则简洁、避免副作用、使用模式规则、合理利用变量和函数等,以提高Makefile的可读性和维护性。 通过深入学习《GNU make中文手册-v3.80》,你将能够熟练掌握Makefile的...

    8_Makefile的使用和编写.pdf

    在学习如何编写Makefile时,首先需要掌握其基本概念、基本格式、简化方法以及常见项目的Makefile编写技巧。 1. Makefile概念:在大型项目中,通常包含大量源代码文件,它们之间存在复杂的依赖关系。手工编译和链接...

    makefile中文手册.pdf

    Makefile的调试非常重要,需要了解Makefile的执行过程和调试技巧。Makefile的调试需要使用调试工具,例如GNU Make的调试选项和调试命令。 总结 Makefile是自动化编译和构建过程的工具,广泛应用于Linux和Unix...

    Makefile 的编写指导

    ### Makefile 的编写指导 #### 概述 Makefile 是一种用于自动化编译流程的脚本文件,在 Unix 和类 Unix 系统中广泛使用。它不仅适用于 C/C++ 项目,也...希望本文能够帮助您更好地理解和掌握 Makefile 的编写技巧。

    Vi、Makefile使用练习

    ### Vi编辑器使用知识点 #### 实验目标 - **熟练运用Vi编辑器**:通过...通过以上内容的学习与实践,可以有效地掌握Vi编辑器的基本使用技巧以及如何编写处理多文件的Makefile,这对于日常的编程工作是非常有帮助的。

    Linux_Makefile实验.pdf

    Linux Makefile 实验文档深入探讨了Makefile在Linux和Unix系统中的应用...此外,还涉及了Makefile在处理跨平台兼容性以及项目模块化方面的高级应用,从而帮助读者深入理解Makefile在项目构建过程中的重要性和应用技巧。

    makefile的制作方法

    通过熟练掌握Makefile的编写技巧,开发者可以更好地管理和维护大型项目,减少手动编译的繁琐工作,提升工作效率。在实际工作中,Makefile还可以与其他构建工具(如autotools、CMake等)结合,实现更复杂的构建流程。

Global site tag (gtag.js) - Google Analytics