教会你如何编写makefile文件

 

最近一直在学习makefile是如何编写的。当我们写的程序文件比较少的时候,敲入gcc /g++,当你在大型工程中,在一个个编译文件的话,你可能就会很郁闷。linux有一个自带的make命令,它让你的工作省去了很大的力气,但是你要学习如何编写makefile文件。

makefile是一种特殊的文件格式,他将会帮你自动管理你的项目,很强大。

 

下面通过实例一步步讲解如何使用makefile。下面的四段代码。

 

//main.cpp

#include "functions.h" 

int main()

{ 

print_hello(); 

cout << endl; 

cout << "The factorial of 5 is " << factorial(5) << endl; 

return 0; 

} 

//hello.cpp 

#include "functions.h" 

void print_hello()

{ 

cout << "Hello World!"; 

} 

///factorial.cpp

#include "functions.h" 

int factorial(int n)

{ 

if(n!=1)

{ return(n * factorial(n-1)); } 

else return 1; 

} 

//functions.h

void 

print_hello();

 int factorial(int n); 

请将以上文件放到一个目录下。

 

请注意: 我用的是g++进行编译的,你也可以按照你自己的选择来编译程序

make的作用

如果你运行:    make命令, 它将会自动的在你的目录下寻找makefile文件,然后执行它,如果你几个makefile文件,你可以指定某一个特定的makefile文件 使用如下命令:

make -f  mymakefile

如果你想知道更多的make 用法,可以执行man  make 命令

 

执行过程

  1. 编译器将会编译你的源文件,然后输出目标文件
  2. 链接器执行目标文件然后创建一个可执行文件。

手动编译  

 

最不理想的一种执行方式就是

 g++ main.cpp hello.cpp factorial.cpp -o hello

akefile 基本规则

makefile的基本规则是有以下构成:

target: dependencies

[tab] system command

利用以上语法编写如下       

all:

        g++main.cpp hello.cpp factorial.cpp -o hello

然后运行你的makefile,如下

make -f Makefile-1

如上代码叙述,所写的目标是all,all是makefile默认的目标,如果没有其他规定,make语法将要执行这个目标文件。

我们还发现,all 目标并没有依赖的,所以按照命令让他安全的执行。

最后,make 通过 我们给的命令进行编译程序

使用依赖

这是因为,如果你修改一个单独的文件在你的项目,你不必重新编译一切,只有你修改。 请看下边的例子

all: hello

hello: main.o factorial.o hello.o
	g++ main.o factorial.o hello.o -o hello

main.o: main.cpp
	g++ -c main.cpp

factorial.o: factorial.cpp
	g++ -c factorial.cpp

hello.o: hello.cpp
	g++ -c hello.cpp

clean:
	rm -rf *o hello

我们看到目标all 只有依赖,没有系统命令。为了去执行正确,它必须满足所有的目标所依赖的。目标都回去搜索所有的依赖,然后去执行它。

在例子中,我们看到了clean的目标,clean 这个目标就是清楚中间生成的.o文件和那些可执行文件

使用变量和注释

当你写makefil文件的时候,当你想改变一些编译的一些选项的时候,他是非常有用处的。

# 这是注释,CC 编译器.
 CC=g++
# CFLAGS  是选项
CFLAGS=-c -Wall
#  目标文件
OBJECTS=main.o factorial.o hello.o
all: hello

hello: $(OBJECTS)
    $(CC) main.o factorial.o hello.o -o hello

main.o: main.cpp
	$(CC) $(CFLAGS) main.cpp

factorial.o: factorial.cpp
	$(CC) $(CFLAGS) factorial.cpp

hello.o: hello.cpp
	$(CC) $(CFLAGS) hello.cpp

clean:
	rm -rf *o hello

你可以看到,使用这些有时候是非常有用的。你可以使用它们,赋值,当你想改变一些变量值的时候,然后你可以使用$(var),

来应用这些变量

 

如何继续下去

通过以上简要的介绍,你就可以简要的去编写一些更加复杂的makefile来运行你的复杂的程序了。上边讲的只是冰山一角

,你可以通过差一些make的文档来写。

CC=g++
CFLAGS=-c -Wall
LDFLAGS=
SOURCES=main.cpp hello.cpp factorial.cpp
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=hello

all: $(SOURCES) $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)
	$(CC) $(LDFLAGS) $(OBJECTS) -o $@

.cpp.o:
	$(CC) $(CFLAGS) {1}lt; -o $@
时间: 2024-10-07 23:59:38

教会你如何编写makefile文件的相关文章

cmake-通过MakeFile文件了解项目目录结构,编写CMake的CMakelist.txt文件方法。

问题描述 通过MakeFile文件了解项目目录结构,编写CMake的CMakelist.txt文件方法. 主项目:CC = gccCFLAGS += -O3BIN_DIR = ./binSRC_DIR = ./srcDOC_DIR = ./docsINC_DIR = ./includeLIB_DIR = ./libBIN = siftfeat match dspfeat all: $(BIN) libopensift.a docs docs: doxygen Doxyfile libopensi

从简入难makefile文件编写,Linux C++编程,简单vi命令

 1.一个最基本的C++程序 2.第二个c++程序 3.第一个入门级别的简单的makefile 4.在makefile中定义变量. 5.编写makefile的依赖 如果start:标识后面的某个.o没有,则重新编译没有编译的那个文件 6.最终的makefile文件 总结:makefile是通过.o文件是否存在已经.cpp最后的修改时间来判断是否重新编译.o文件. 7.makefile不管理.h文件,它是编译器来进行管理的.     vi: i在光标之前插入 a在光标后面插入 x删除后面的字符

提前认识软件开发(17) makefile文件的书写及应用

makefile用于Linux下整个工程的编译,对于Linux下的C/C++语言的编译是至关重要的. 本文以实际的C源程序为例子,介绍如何使用makefile来编译Linux下的C语言工程,为相关开发工作的开展提供了参考. 一.什么是makefile? makefile是什么?如果你写的程序只是在Windows下运行,那么很有可能不知道有这个玩意儿.而如果你要在Linux下编译并运行程序,那么你几乎不可避免地要和makefile打交道. makefile是一个文件,里面定义了一系列的规则来指定一

例解 autoconf 和 automake 生成 Makefile 文件

本文介绍了在 linux 系统中,通过 Gnu autoconf 和 automake 生成 Makefile 的方法.主要探讨了生成 Makefile 的来龙去脉及其机理,接着详细介绍了配置 Configure.in 的方法及其规则. 2 评论: 杨 小华, Linux 内核开发工程师, 自由撰稿人 2006 年 9 月 21 日 内容 引子 无论是在Linux还是在Unix环境中,make都是一个非常重要的编译命令.不管是自己进行项目开发还是安装应用软件,我们都经常要用到make或 make

gcc-C语言中编写makefile遇到的问题

问题描述 C语言中编写makefile遇到的问题 自己在博客中写了由几个文件构成的代码,最后生成了一个静态库叫做libsum.a,里面保存着几个供main() 函数调用的函数,自己最后再把这个库和mian.c文件一起编译.可是makefile中一直报错 (具体的错误在博客最后面写出来了,我感觉不知道为什么?我用gcc -o 有问题吗?)自己写的博客 感谢大家,感谢平台. 解决方案 gcc -o 就是指定输出文件名. 解决方案二: make: *** No rule to make target

linux makefile文件

Make工具最主要也是最基本的功能就是通过makefile文件来描述源程序之间的相互关系并自动维护编译工作.而makefile 文件需要按照某种语法进行编写,文件中需要说明如何编译各个源文件并连接生成可执行文件,并要求定义源文件之间的依赖关系.makefile 文件是许多编译器--包括 Windows NT 下的编译器--维护编译信息的常用方法,只是在集成开发环境中,用户通过友好的界面修改 makefile 文件而已. makefile文件主要包含了5个主要内容:显示规则.隐式规则.变量定义.文

让你提前认识软件开发(17):makefile文件的书写及应用

第1部分 重新认识C语言 makefile文件的书写及应用   [文章摘要]         makefile用于Linux下整个工程的编译,对于Linux下的C/C++语言的编译是至关重要的.        本文以实际的C源程序为例子,介绍如何使用makefile来编译Linux下的C语言工程,为相关开发工作的开展提供了参考.   [关键词]         makefile  C语言  Linux  编译  开发   一.什么是makefile?         makefile是什么?如果

Configure,Makefile.am, Makefile.in, Makefile文件之间关系

1.autoscan (autoconf): 扫描源代码以搜寻普通的可移植性问题,比如检查编译器,库,头文件等,生成文件configure.scan,它是configure.ac的一个雏形.     your source files --> [autoscan*] --> [configure.scan] --> configure.ac 2.aclocal (automake):根据已经安装的宏,用户定义宏和acinclude.m4文件中的宏将configure.ac文件所需要的宏集

简单通用的makefile文件

########################################################################### 通用makefile文件# makefile规则# target ... : prerequisites ...#     command#   ...#   ...# target 是一个目标文件,可以是Object File,也可以是执行文件?# prerequisites是要生成那个target所需要的文件或是目标,用空格隔开# comma