N0.1 make和makefile的一些基础知识

本文参照自狄泰软件学院:《门徒计划》课程

make和makefile的区别:

make是一个应用程序,用来解释程序之间的依赖关系,并根据依赖关系自动维护编译工作,执行宿主操作系统中的各种命令

makefile是一个描述文件,定义了一系列的规则来指定源文件编译的先后顺序,拥有特定的语法规则,支持函数定义合函数调用,能够直接集成操作系统的各种命令。

两者的关系是makefile中描述用于指导make程序如何完成工作,make根据根据马克file中的规则执行命令,最后完成编译输出


最简单的makefile示例

hello:
    echo "hello makefile"

hello为目标,下面一行是实现目标所需执行的命令

要注意的是目标后的命令需要用Tab键('\t')隔开而不是四个空格

依赖的定义:

targets :通常是需要生成的文件目标名,make所需要执行的命令名称

prerequisities:当前目标所需要的依赖的其它目标或文件

command:完成目标所需要执行的命令

目标、依赖、命令都可以有多个,目标和依赖需要由空格隔开,但是每条命令必须以[Tab]字符开始

要知道续行符 :\  可以将内容分开写到下一行,提高可读性


依赖规则:

当目标对应的文件不存在,执行对应命令,当依赖在时间上比目标更新,执行对应命令,当依赖关系连续发生时,对应依赖立链上的每一个目标



伪目标的引入:默认情况下,make认为目标对应着一个文件,make比较目标文件和依赖文件的新旧关系,决定是否执行命令,make以文件处理作为第一优先级(如果目标和当前文件夹有同名的文件,make会认为是文件ps:两者没有关系,这样会导致不能够执行命令,所以引入伪目标)

makefile中的伪目标,通过.PHONY关键字声明伪目标,伪目标不对应任何的实际文件,而且不管伪目标的依赖是否更新,命令总是执行

伪目标的语法:先声明,后使用 本质:伪目标是make中特殊的目标.PHONY的依赖


伪目标的妙用:规则调用(函数调用)

.PHONY : clean rebuild all

## other rules ##

rebuild : clean all
clean :
    rm *.o hello.out
原理:当一个目标的依赖包含伪目标时,伪目标所定义的命令总会执行


注意:.PHONY是标准make才有的关键字(ps:其他的非标准的make可能没有),可以使用这样的技巧来代替.PHONY


原理是:如果一个规则没有命令或者依赖,并且它的目标不是一个存在的文件名;在执行此规则时,目标总会被认为是最新的



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GNU libiconv-1.15和libintl-0.19.8.1,VS2015工程和 Makefile.mak 命令行编译文件 CSDN-tags: libiconv1.15 libintl 0.19.8.1 VS2015 Makefile 声明: 最新版,修正了relocatable.c文件中GetModuleFileName函数的问题。 代码为本人良心制作,虽然花费了一定的时间和精力,但不保证完全没有错误。如果您下载并使用了本代码,将其包含在您发布的应用中,给您带来了经济上,心理上,生活上的损失,本人不负有责任。 所有代码都基于官网进行修改,iconv的代码来源于libiconv-1.15的lib目录,intl的代码来源于gettext-runtime的intl目录。 intl需要iconv的支持,如果想单独编译不需要iconv的intl, 请自行修改intl目录下的config.h文件, /* Define if you have the iconv() function and it works. */ #define HAVE_ICONV 1 /* Define to 1 if you have the header file. */ #define HAVE_ICONV_H 1 为: /* Define if you have the iconv() function and it works. */ /* #undef HAVE_ICONV */ /* Define to 1 if you have the header file. */ /* #undef HAVE_ICONV_H */ 并修改VS工程中预处理器定义,删掉/DDEPENDS_ON_LIBICONV=1 VS的工程为VS2015的工程文件,使用VC140工具集,如果没有2015,也可以用Makefile.mak文件来编译。 nmake /f Makefile.mak [DLL] [DEBUG] 指定 DLL=1 编译dll版本,默认是lib版本,libiconv.lib , libintl.lib。 指定 DEBUG=1 编译debug版本,默认是release版本。 同理,如果intl不需要iconv,请修改上面的配置文件选项,并, 删掉Makefile.mak中/DDEPENDS_ON_LIBICONV=1 配置文件的制作,参考了以下几处,修改的大概原则是,能定义的全定义了,就这样: https://github.com/kahrl/gettext-msvc 这个地址提供了libiconv和libintl的VS工程和配置文件。 https://github.com/winlibs 为编译PHP而修改的libiconv和libintl源码,libiconv是最新1.15版本,gettext不是。 附带的Cygwin目录中的工具 libiconv官方的制作文档,用cygwin配合VC,生成的配置文件。 欢迎同学们下载测试。有问题可以给我发邮件travel981cn@139.com
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值