Makefile的简单编写

当我们的工程越来越大的以后,每次都使用命令编译显得非常的麻烦.所以我们需要一个自动化编译的工具来帮助我们编译.在我们使用源码安装软件的时候都会有make,make install等操作,这个就是使用Makefile来进行自动化编译的工作的.

Makefile也是一个脚本文件和shell脚本非常的相似,但是也有很多的地方不一样.

程序编译通常会有一下几个步骤,先是预编译,然后将C语言代码编译成汇编,然后在将汇编编译成二进制文件.o文件,然后将所有的.o文件连接起来就得到了可执行文件.

在编写Makefile时,我们先将所有的c语言代码编译成二进制文件,然后将所有二进制文件链接起来.

和shell类似的,里面有变量,有命令,有循环,判断等语句,所有的命令都需要另起一行,而且开始必须是tab键(所有开头是tab键的行都会被认为是命令,哪怕不能执行),变量等必须顶行不能有空格等.

简单的Makefile格式(不涉及循环,选择等语句):

TARGET... : PREREQUISITES...
  COMMAND

a:main.o

  gcc -o main.o

main.o:main.c

  gcc -c main.c

这样就是一个最简单的Makefile

当然我们如果是文件多的话这样写就非常的麻烦,我们就可以使用 变量名 += .....来进行编辑,使用时直接$(变量名)来使用.(和shell一样)

我们也常常会使用make clean的命令等,这个叫做伪目标,直接

clean:

  rm *.o

install:

  cp .. /bin

Makefile文件也可以应用其他的Makefile文件

include 文件名

在我们写了.o文件名以后,当.o和.c文件是同名时,我们也可以不用.c文件,make会自动查找同名的文件,例如%.o:%.c.

以下是一些自动化变量:

[email protected]
表示规则的目标文件名。如果目标是一个文档文件(Linux中,一般称.a文件为文档文件,也称为静态库文件) ,那么它代表这个文档的文件名。在多目标模式规则中,它代表的是哪个触发规则被执行的目标文件名。

$%
当规则的目标文件是一个静态库文件时,代表静态库的一个成员名。例如,规则的目标是 “foo.a(bar.o)” , 那么, “$%” 的值就为 “bar.o” , “[email protected]” 的值为“foo.a” 。
如果目标不是静态库文件,其值为空。

$<
规则的第一个依赖文件名。 如果是一个目标文件使用隐含规则来重建, 则它代表由隐含规则加入的第一个依赖文件。

$?
所有比目标文件更新的依赖文件列表,空格分割。如果目标是静态库文件名,代表的是库成员(.o文件) 。

$^
规则的所有依赖文件列表,使用空格分隔。如果目标是静态库文件,它所代表的只能是所有库成员(.o文件)名。一个文件可重复的出现在目标的依赖中,变量“$^”只记录它的一次引用情况。就是说变量“$^”会去掉重复的依赖文件。

$+
类似“$^” ,但是它保留了依赖文件中重复出现的文件。主要用在程序链接时库的交叉引用场合。

$*
在模式规则和静态模式规则中,代表“茎” 。 “茎”是目标模式中“%”所代表的部分 (当文件名中存在目录时, “茎” 也包含目录 (斜杠之前) ) 。例如:文件“dir/a.foo.b” ,当目标的模式为“a.%.b”时,“$*”的值为“dir/a.foo” 。 “茎”对于构造相关文件名非常有用

以下是一般的简单的Makefile写法:

COBJS += main.o

#CFLAGS += -O2 -Wall -DDEBUG
CFLAGS += -I./

LDFLAGS += -lmxml -lpthread

CROSS_COMPILE ?=

CC = $(CROSS_COMPILE)gcc

TARGET = tag

all:$(TARGET)
$(TARGET):$(COBJS)
$(CC) -o [email protected] $^ $(LDFLAGS)

%.o:%.c
$(CC) $(CFLAGS) -c -o [email protected] $^ $(LDFLAGS)

.PHONY:clean
clean:
rm -f $(COBJS)

时间: 2024-12-14 16:32:21

Makefile的简单编写的相关文章

简单编写Makefile

相信很多朋友都有过这样的经历,看着开源项目中好几页的makefile文件,不知所云.在日常学习和工作中,也有意无意的去回避makefile,能改就不写,能用ide就用ide.其实makefile并没有想象的那么难写,只要你明白了其中的原理,自己实践几次.你也可以自己写makefile,让别人对你头来羡慕的目光. 下面本人介绍一下自己的学习成果,初学阶段,欢迎大家多多指正.简单的说,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至可以在m

简单编写makefile文件,实现GCC4.9编译项目,加入boost库测试等等。。

一.需要用到的hw.cpp hw.h funtest.cpp funtest.h makefile 几个测试文件 1.hw.cpp代码如下: #include "hw.h" #include "funtest.h" using namespace std; using namespace boost; int main() { timer t; { int i=1; } auto i="abc"; cout<<i<<end

ctags 和Makefile的简单使用

ctags ctags是vim下方便代码阅读的工具.尽管ctags也可以支持其它编辑器,但是它正式支持的只有VIM.并且VIM中已经默认安装了Ctags,它可以帮助程序员很容易地浏览源代码.(尤其是大型的工程) 一.安装ctags 1.命令行安装 切换到root用户之下,输入yum install ctags 2.下载源码安装(网上提供的方法) 1)从http://ctags.sourceforge.net/下载源代码包后,解压缩生成源代码目录, 2)然后进入源代码根目录执行./configur

从小程序中看make和Makefile的简单使用

我们都知道程序在执行之前会有两个很重要的过程:编译和链接.当然我们在Windows平台的编译器中(像vs),它会自动帮我们生成最后的执行程序,如(xxx.exe):但是Linux下我们使用vim时,gcc和g++是可以一次性将一个源代码生成可执行程序,可是一个项目可不止一个源文件,一个项目的运作是要将各个源代码编译成目标文件后,再将它们链接起来后执行的. 试想一下如果一个工程有上百个源文件,那你将所有源文件都编译链接完后,程序也能跑起来,然后你的boss不满意,让你修改几处地方,然后你改完之后又

linux——学习篇(三)之makefile的简单应用及实现简单的进度条

一.makefile make是一个命令,而makefile是一个文件.make命令执行时,需要一个 Makefile 文件,以告诉make命令需要怎么样的去编译和链接程序.一个工程中的源文件不计数,其按类型.功能.模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令.makefile 带来的好处就是--"自动化编译

Ubuntu下makefile的简单使用

在Windows下,只需要简单的点击以下make,rebuild即可.而在Linux下,这样的IDE环境并没有提供,难道必须每一步都执行一遍吗?比较ok的做法自然是能够利用批处理脚本来进行操作了,这样,只需要修改脚本中需要编译的文件即可.在Linux下,提供了这么一个方便的工具,make.那么接下来我们来利用make进行程序的组织编译吧. 1. 编写tool.h #ifndef __TOOL_H #define __TOOL_H void printInteger(int number); #e

Linux 内核 Makefile 体系简单分析 (转)

转载自mz_linux的ChinaUnix博客 :http://blog.chinaunix.net/uid-26806098-id-3141136.html 众所周知,Linux内核是使用make命令来配置并编译的,那必然少不了Makefile.在内核目录树中我们可以看到内核编译系统的顶层Makefile文件.但是如此复杂.庞大的内核源码绝不可能使用一个或几个Makefile文件来完成配置编译,而是需要一套同样复杂.庞大,且为Linux内核定制的Makefile系统.她可以说是内核的一个子系统

Linux平台Makefile文件的编写基础篇(转)

目的:       基本掌握了 make 的用法,能在Linux系统上编程.环境:       Linux系统,或者有一台Linux服务器,通过终端连接.一句话:有Linux编译环境.准备:       准备三个文件:file1.c, file2.c, file2.h       file1.c:              #include <stdio.h>              #include "file2.h"              int main()  

Hibernate系列(二):简单编写HibernateUtil类来优化性能

相对于Hibernate系列(一)中的代码编写HibernateUtil类以提高程序的运行速度 首先,仍然要写一个javabean(User.java): package cn.itcast.hibernate.domain; import java.util.Date; public class User { private int id; private String name; private Date birthday; public int getId() { return id; }