当前位置:  技术问答>linux和unix

makefile初学者指南

    来源: 互联网  发布时间:2016-04-08

    本文导语:  刚翻译的,只针对对makefile的初学者,非初学者请pass,免得乱费你的时间。 Makefile 初学者指南    翻译: www.csdn.net guosha(田伯光) 原文地址:http://mrbook.org/tutorials/make/ 想像一下,你的程序有许多源文件,而当...

刚翻译的,只针对对makefile的初学者,非初学者请pass,免得乱费你的时间。

Makefile 初学者指南

   翻译: www.csdn.net guosha(田伯光)
原文地址:http://mrbook.org/tutorials/make/

想像一下,你的程序有许多源文件,而当你想编译这个程序时需要手动输入每一个编译指令会是一件多么枯燥无味的事情。让人觉得庆幸的是,你可以有更好方法,当你学会了写Makefile后,你就再也不用天天手动输入编译指令来编译你的程序了。Makefile是一个遵循特殊规则的文本文件,跟make工具一起可以帮助你自动创建和管理你的工程。

在进一步的学习之前,你需要以下几个文件:

main.cpp
hello.cpp
factorial.cpp
functions.h

另外我建议你新建一个新的目录,然后把这些文件都入到这个新建的目录下去.

注意:我使用g++来编译,你可以选择任何你喜欢的编译器

make 工具

当你在shell下执行命令

make

这个程序会在当前目录查找一个名为makefile的文件,然后执行这个文件,如果当前目录里有多个makefile文件,你可以使用如下命令在执行时定制使用哪一个makefile文件:

make -f MyMakefile

make工具还有一些其它的选项,你可以man make来得到这些选项的信息。

创建可执行程序的过程

1、编译器把源文件编译成目标文件
2、链接器把目录文件链接成可执行程序

手动编译

一个不可取的方法去编译源文件得到目标文件是通过手动执行下面的命令:

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

基本的Makefile

基本的makefile文件组成如下:

target: dependencies
[tab] system command

应用到我们刚才的例子后如下:

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

把上面这段文字保存为Makefile, 然后执行make就可以执行这个Makefile文件。在这个例子里,我们可以看到makefile的目标是all, 这是makefile文件的默认目标。如果没有定义其它目标,make工具会执行这个目标。同样我们可以看到目录all并没有依赖任何其它的东西,所以make可以肯定会执行后面定义的命令。最后,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只有一个依赖关系,并没有相应的系统命令。为了让make正确的执行,终极目标的所有依赖关系都必须符合(这里是all)。make会搜索每一个目标的依赖关系并试着执行相应的系统命令。
在这里我们可以看到有一个名为clean的目标,这个目标用于当你想快速删除所有生成的目标文件和可执行文件的时候,只需要在shell提示符下简单的输入make clean。

使用变量和注释

Makefile也支持使用变量,它在你想改变使用的编译器或是编译选项时非常的有用。

# I am a comment, and I want to say that the variable CC will be
# the compiler to use.
CC=g++
# Hey!, I am comment number 2. I want to say that CFLAGS will be the
# options I'll pass to the compiler.
CFLAGS=-c -Wall

all: hello

hello: main.o factorial.o hello.o
$(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

如上所示,你会发现变量在写makefile的时候非常的有用。通过变量,你可以在写你的目标规则前把一个值赋给一个变量。然后,你可以使用$(VAR)来表示实际的内容。

进一步的学习

通过上述对makefile的简略介绍,你可以创建一些非常普通的makefile文件来编译你的项目。然而这只是有关make的冰山一角。我想如果没有仔细参阅一些其它的有关makefile的详细文档,没有人可以完全理解下面的例子。

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) $

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Makefile.in,Makefile.am,Makefile.bor应该怎么用?
  • makefile.am和makefile.in是什么文件,与makefile有什么联系吗?
  • 最近在学习linux C 看到了makefile部分,觉得makefile的语法很难理解,Makefile 的语法是不是shell语法?
  • 求解makefile问题,makefile.conf的作用?
  • 从网上载了个C++程序的源代码,包含38个.cpp和.h,还有makefile.in和makefile.am两个文件,但无configure和makefile.请问怎么编译?谢谢!
  • 有makefile.am,有 makefine.in 为什么就是没有Makefile?
  • makefile如何调用文件目录下的makefile
  • 请教根据Makefile.am自动生成Makefile的问题
  • 怎麼樣使Makefile.in生成Makefile?
  • 【急!】一个程序里有好多文件夹里都有Makefile,如何找到最管用的makefile
  • 【makefile使用】请问怎样在shell中获取makefile的最终目标?
  • unix下面make makefile文件,提示“makefile is up-to-date",怎么办呀?
  • Makefile使用遇到的问题!"Makefile:3:missing the separator.stop"在线等待.......
  • Makefile是如何输出执行的路径的,表示执行的是那个Makefile
  • 下的tar.gz源码里只有makefile.in和makefile.am
  • 一句 makefile 的解释 -- makefile 与 shel 结合
  • linux makefile error :Makefile:335: *** commands commence before first target。
  • [test@localhost ~]$ cat <makefile >catfile 跟cat > catfile <makefile是一样的吧?
  • 关于makfile,makefile.in, makefile.am. configure之间的关系
  • win32下编译Linux 下的项目(makefile.am和makefile.in)


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3