设为首页 收藏本站
查看: 1379|回复: 0

[经验分享] Linux下make与makefile

[复制链接]

尚未签到

发表于 2018-5-21 09:53:40 | 显示全部楼层 |阅读模式
  make 用来解析 makefile 文件
  

  make 的选项:
  -d显示调试信息
  -f 文件默认是从 makefile 或 Makefile 中读取依赖信息,用该选项可更改文件
  -h显示所有 makefile 的 help 信息
  -n显示 makefile 执行命令的顺序,但不执行
  -s运行时不显示任何信息
  

  

  

  makefile 格式:
  

  目标:依赖列表
  <Tab>命令列表
  

  目标通常是指要生成的文件的名称,可以使可执行文件或obj文件,也可以是一个执行的动作名称,如clean
  。依赖是用来  产生目标  的材料,比如源文件,一个目标经常有多个依赖
  命令是生成目标时执行的动作,一个规则可以含有几个命令,每个命令占一行
  

  执行make clean时,由于clean没有依赖,所以它的命令将被强制执行
  make clean中的 clean 是一个虚目标,一般用来删除 make 产生的文件
  

  makefile 语法:
  

  #注释
  \连接符,前后不要有空格
  ?,*通配符
  

  

  例1. hello.c文件内容:
#include<stdio.h>
int main(void)
{
printf("Hello Linux!\n");
return 0;
}  关于hello.c的 makefile 文件内容为:
hello:hello.o
gcc -o hello hello.o或 gcc hello.o -o hello
hello.o:hello.c
gcc -c -o hello.o hello.c或 gcc -c hello.c -o hello.o
clean:
rm -f *.o  

  
  多文件时 makefile 编写:
  

  例2.假如源文件 a.c 和 b.c 可生成可执行文件 test。其 makefile 文件内容为:
test:a.o b.o
    gcc -o test a.o b.o    或  gcc a.o b.o -o test
a.o:a.c
    gcc -c -o a.o a.c     或   gcc -c a.c -o a.o
b.o:b.c
    gcc -c -o b.o b.c     或   gcc -c b.c -o b.o
clean:
    rm -f *.o  

  

  make 只有在依赖比目标新的时候才会执行其后命令。可通过 touch 命令修改某文件时间。
  

  

  

  makefile 中变量的 定义 方式为: 变量 := 值
  makefile 给变量 增加 一个值为: 变量 += 值
  makefile 中变量的 引用 方式为: $(变量名) 或 ${变量名}、$单字符变量
  

  例如:
  C=gcc
  $C
  

  CC=gcc
  $(CC) 或 ${CC}
  

  

  例3:
  用此方式,修改 例1 的 makefile 文件为:
CC := gcc
Objects := test.o
Sources := test.c
test:$(Objects)
    $(CC) -o test $(Objects)
$(Objects):$(Sources)
    $(CC) -c -o $(Objects) $(Sources)
clean:
    rm -f *.o  

  makefile 中还可添加如下命令来进行打包:
  

  tar:
  tar -cvf pack.tar makefile *.c *.h
  

  执行 make tar 就可以将文件夹中所有 .c .h 还有 makefile 文件打包
  

  makefile 中的内置变量:
  

  $@当前目标的名称
  $^所有依赖
  $<比当前目标更新的依赖。第一个依赖
  $?比当前目标更新的依赖 列表 。表示所有已修改的依赖文件
  

  利用内置变量,修改 例3 的 makefile 文件为:
CC := gcc
Objects := test.o
Sources := test.c
test:$(Objects)
    $(CC) -o $@ $^
$(Objects):$(Sources)
    $(CC) -c -o $@ $^
clean:
    rm -f *.o  

  注意:内置变量指代的内容是不固定的,是随上下文变化的。例如:
  abc:bcd
  里面的目标为 abc ,依赖为 bcd。而
  hello:hello.c
  里面的目标为 hello,依赖为 hello.c
  

  

  还可以利用 makefile 默认的识别方式,用 %.c 表示所有 .c 文件,%.o 表示所有 .o 文件:
  例如:改写 例2:
test:a.o b.o
    gcc -o $@ $^        或    gcc $^ -o $@
%.o:%.c
    gcc -c -o $@ $^    或     gcc -c $^ -o $@
clean:
    rm -f *.o  

  makefile 如果省略文件名,会默认将目标与依赖同名。此时,可省略依赖和命令。
  例如:再次简化上例:
test:a.o b.o
    gcc -o $@ $^    或    gcc $^ -o $@
a.o:
b.o:
clean:
    rm -f *.o  

  上面的
  a.o:
  b.o:
  两行可以简写成一行:
  %.o:
  

  
  
  

  虚目标:
  

  makefile 中有一些目标,它们是一些不存在的文件,而且也无需创建他们,这些目标称虚目标。
  虚目标允许你强制执行某些事件,而这些事件在正常规则中不会发生。
  虚目标总是使与之有关的命令被执行。
  

  常见虚目标列表:
  all生成工程中所有可执行者,通常是 makefile 的第一个生成目标
  clean删除 make all 生成的所有文件
  install在系统目录中安装工程项目生成的可执行文件和文档
  uninstall删除 make install 安装的所有文件
  

  

  例如,某安装包的 makefile 文件如下:
InstallDir := /usr/local/bin/
install:a b
    cp -f $^ $(InstallDir)
    cd $(InstallDir); chmod 777 $^
    rm -f *.o $^
uninstall:
    cd $(InstallDir); rm a b
a:a.o
    gcc -o a a.o
a.o:a.c
    gcc -c -o a.o a.c
clean:
    rm -f *.o  

  执行 make install 即可安装。
  

  有时候,为了防止 makefile 中的虚目标与实际文件重名,例如:实际路径中存在一个 install 文件,如果执行 make install ,则会报错。为了防止这种情况,可在虚目标前面加上修饰符,如下:
  clean:
  rm -f *.o
  .PHONY:clean
  加上之后,即使有同名文件,也不会报错。
  .PHONY 后可加多个虚目标,例如:
  .PHONY: module module_install clean
  下例执行 make all 可以生成所有目标:
  all:test hello
  test:test.o
  .....
  hello:hello.o
  ....
  

  
  makefile 常见错误:
  1.制表符用空格代替。解决办法:cat -t makefile可查看makefile中的制表符:^I
  2.连接符'\'和换行符之间插入了空格。解决办法:cat -e makefile。会将换行符用 $ 显示

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-478507-1-1.html 上篇帖子: linux 命令 —— free 下篇帖子: linux部分变量
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表