makefile的总结

在学习linux的过程中,Makefile的写法很重要,现在总结下自己所学如何写makefile

1、首先要了解下程序的编程过程

语言主要分为两种,编译语言和解释语言

编译语言:在程序运行之前需要经过两步:编译和链接。首先是编译阶段,编译阶段主要是检查程序的函数语法是否正确,变量的声明是否正确。只要没有错误的语法,编译器就可以成功将源文件编译成为目标文件,每个源文件对应生成一个目标文件。第二步是链接,即链接器将目标文件链接为可执行文件,链接器是并不管函数所在的源文件,而是只考虑目标文件。目标文件的后缀在windown和linux不同,在window中,目标文件后缀为.obj,而在linux或者Unix中,后缀为.o。

有些工程的源文件比较多,生成的源文件也比较多,等链接器链接目标文件时比价复杂,为此,可以将目标文件进行打包。在window中,将多个目标文件.obj打包为库,后缀为.lib,在linux中,将多个目标文件.o打包为.a库。

编译语言在生成可执行文件之前,需要进行编译和链接的过程,但是仅需要执行一次,在后续的再次执行时,是不需要再次进行编译连接,所以编译语言的效率比较高。常用的有c、c++

解释语言:边执行边解释,执行一句解释一句。每个语句都是在执行的时候才进行翻译。所以解释语言每运行一次就需要一次解释。但是解释语言也有自己的优点,即他在不同操作系统的兼容性比较好。常用的解释语言有Python、java或者Ruby等



2、make和makefile的编译链接规则:

在执行make命令的时候,系统会默认在当前目录下寻找Makefile或者makefile文件,以告诉make命令如何去编译和链接源代码

假如一个工程包含多个源文件和头文件,对其进行编译和链接需要以下几个规则:

1)如果这个工程没有编译过,那么所有的源文件都需要被编译链接;

2)如果某几个.c源文件修改,则需要重新对这几个源文件进行编译生成目标文件,再重新链接生成最终的可执行文件;

3)如果头文件发生变化或者修改,则需要重新编译包含这几个头文件的源文件生成目标文件,然后重新编译生成最终的可执行文件;



3、 makefile的写法:(两种写法)

方法一:

target:prerequisites

   command

注意:若command和target:prerequisites不在同一行时,command前面必须是TAB键

方法二:

target:prerequisites;command

注意:若command和target:prerequisites在同一行,之间用分号。

target 目标文件:既可以是可执行文件也可以是目标文件

prerequisite:生成target所需的源文件、头文件或者是目标文件

command:prerequisites->到target所需要进行的操作

注意:若prerequisites的文件比target新,那么就需要重新编译链接

eg:

edit : main.o kbd.o command.o display.o insert.o search.o files.o utils.o
            cc -o edit main.o kbd.o command.o display.o insert.o search.o files.o utils.o 
    main.o : main.c defs.h
            cc -c main.c
    kbd.o : kbd.c defs.h command.h
            cc -c kbd.c
    command.o : command.c defs.h command.h
            cc -c command.c
    display.o : display.c defs.h buffer.h
            cc -c display.c
    insert.o : insert.c defs.h buffer.h
            cc -c insert.c
    search.o : search.c defs.h buffer.h
            cc -c search.c
    files.o : files.c defs.h buffer.h command.h
            cc -c files.c
    utils.o : utils.c defs.h
            cc -c utils.c
    clean :
            rm edit main.o kbd.o command.o display.o \
               insert.o search.o files.o utils.o

备注:红色代表的是target;紫色代表的是prerequisites;绿色表示的command

可执行文件edit依赖于多个.o目标文件,而每个.o文件又依赖于各自的.h头文件和.c源文件。



4、makefile引用其他的makefile

makefile也可能包含其他的makefile,书写语法类似于c语言的include,可以利用关键字include包含其他的makefile文件。在执行makefile的时候,会把include包含的makefile内容放置在当前的位置。



5、make具有自动推导功能

在执行make命令的时候,make具有自动的推导功能,即在看到目标target和prerequisites后,可以推导出command。所以我们可以简化makefile,比如第三小节的例子可以简写如下:

edit : main.o kbd.o command.o display.o insert.o search.o files.o utils.o
     
    main.o : main.c defs.h

kbd.o : kbd.c defs.h command.h

command.o : command.c defs.h command.h

display.o : display.c defs.h buffer.h

insert.o : insert.c defs.h buffer.h

search.o : search.c defs.h buffer.h

files.o : files.c defs.h buffer.h command.h

utils.o : utils.c defs.h

clean :
            rm edit main.o kbd.o command.o display.o \
               insert.o search.o files.o utils.o



6、makefile寻找文件

makefile在寻找源文件或者目标文件时,遵循的原则如下:

1)先寻找makefile中指定的路径寻找,若没找到;

2)在当前目录下寻找,若没有;

3)默认去/usr/local/bin和/usr/local/inlude去寻找相应的文件。

makefile的总结

时间: 2024-11-08 07:07:52

makefile的总结的相关文章

关于makefile中变量的多次赋值以及override指令

1 基本原则如下 1.1 原则1 变量的普通赋值是有先后顺序的,后面的赋值会覆盖掉前面的赋值. 1.2 原则2 使用的时候,用的是其前面最后的赋值,就算其后面有使用了override指令的赋值也不会影响这条原则. 1.3 原则3 当使用了override指令定义赋值了变量后,其后对该变量的所有的赋值都是无效的.但是override之前的所有的赋值都是有效的.使用的时候是往前最近原则. 2 override变量.命令行参数和普通变量之间的屏蔽关系 override变量会屏蔽命令行参数,除非用+=:

使用Makefile去管理程序

前言:在gcc中如何使用分屏操作  : 在命令行中使用    : sp + filename     vim  Makefile  编辑make工程   第一行使用 # 进行注释   说明是什么make  内容格式:  目标文件:  依赖文件 ·  ·  ·  但是一定要注意如果要使用编译指令一定要用table键 不能使用几个空格代替 另外  max.h 和min.h 的内容就是函数声明 下面说下这样make的好处吧:  在大型程序中能很好帮我们管理我们的代码和项目,程序的任何部分分工都很明确,

Contiki 2.7 Makefile 文件(三)

2.第二部分 这里的usage,targets,savetarget,savedefines都是伪目标. 和all不同,这些伪目标不会被执行,除非显式指定这些目标. 这里有两个目标savetarget,savedefines前边我们提过. 通过命令 make TARGET=esb savetarget可以保存默认的TARGET到Makefile.target中. 通过命令 make TARGET=esb DEFINES=MYTRACE,MYVALUE=4711 savedefines 可以保存默

My first makefile to compile multiple C files

I have three files to compile: main.c, func.c,  func.h The steps: 1   main.c   to   main.o 2   func.c    to   func.o 3    link main.o func.o to main(file that can execute) So, u need to run at least three commands without a Makefile.Then if u have 10

liunx中ctags 与makefile的使用

ctags 是vim下可以帮助阅读代码的一个的工具,它可以很方便的看到程序的源代码 使用ctags可以有两种方法:(1).可以在任意目录下建立文件,然后使用 ctags *.c,这个命令的意思是把当前目录下的所有文件生成标签文件(vim可以通过标签,跳转到标签文件处)例如: vim ctag.h vim ctag.c vim main.c 在main.c中把光标移至fun函数处,按Ctrl+[就会跳转到fun函数定义的地方,即ctag.c处,Ctrl+T回转到main.c函数 (2).输入cta

linux中make命令的简单使用以及Makefile文件的书写

Makefile 会不会写makele,从一个侧面说明了一个是否具备完成大型工程的能力. 一个工程中的源件不计数,其按类型.功能.模块分别放在若干个目录中,makele定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makele就像一个Shell脚本一样,其中也可以执行操作系统的命令.makele带来的好处就是"自动化编译",一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率. ma

makefile编译文件介绍

通常在C语言程序开发中,尤其是大型项目的构建,我们不可能一个文件一个文件去编译,通常会编写Makefile文件使用make命令完成项目的编译构建: 如下:math项目是简单的计算那个数字大,哪个数字小,以及两个数字和的小程序.由max.c,min.c , sum.c 和main.c构成,分别如下: max.c #include <stdio.h> int max(int a,int b) {     if(a>b){         return a;      }else{      

通用多目录makefile的写法

我的项目文件层次是:项目名称/include.output.src src/admin.stu.tch.common 最外层的Makefile: DEBUG = yMYDEBUG = DEBUGifeq ($(DEBUG),y)DEBFLAGS = -O -g -D$(MYDEBUG)elseDEBFLAGS =endif PRJ_HOME := $(shell pwd)SOURCES := $(wildcard *.c)OBJECTS := ${SOURCES:%.c=%.o}INCPATH

mcstructs使用CMake生成Makefile文件

CMakeLists.txt project(MCSTRUCTS) set(SRC_LIST src/main.c src/mcslist.c src/mcsringbuf.c) add_executable(mcstructs ${SRC_LIST}) 执行过程: [email protected]:~/projects/mcstructs$ cmake . -- Configuring done -- Generating done -- Build files have been writ

makefile实例(2)-多个文件实例

1,源文件依赖关系 defs.h command.h buffer.h main.cpp * util.cpp * kde.cpp * * command.cpp * * display.cpp * * insert.cpp * * search.cpp * * files.cpp * * * 2, 源文件 因为这里只是想做一下简单测试,所以很多源文件的内容都是空的. [[email protected] 1-makefile]#head *.h ==> buffer.h <== #pragm