Linux程序设计:make和makefile

make和Makefile

当我们编写的程序较大时,不可避免会有很多的源文件不可避免有时这些文件会存在很多相互引用的问题,如果其中一些文件发生改变,就必须重新编译文件,但是另一方面如果编译全部文件的代价是巨大的,所以我们必须知道那些文件有依赖关系,make为我们提供一个很好的工具去管理这些关系,Makefile的编写是很让人很痛苦的。但是我们的另一方面我们必须很好的掌握它

关于make的参数:

-k 他的作用是让make在发现一个错误时仍继续执行下去,而不是马上停下来,这样可以让我们一次性将所有的错误都找出来

-n 输出将执行的步骤,而不是真正的执行他。

-f <filename> 告诉makeh将那个文件作为Makefile,如果不指定文件名,就将在当前的目录下搜索Makefile这个文件如果找不到就会找寻Makefile。make如果不指定创建文件的名字。那么他将创建makefile的第一个目标

所以很多时候我们会将第一个目设为all,然后再列出其他的从从属目标这样的目的是,明确的告诉make在未指定目标文件时,默认情况下应该创建那个文件

下面是例子:

<span style="font-size:18px;">myapp: main.o 2.o 3.o
  gcc -o myapp main.o 2.o 3.o

</span>




myapp:: main .o 2.o 3.o定义了要生成myapp需要的文件

然后下面的一行定义了生成文件需要的命令(注意:这一行的开头是以TAB开头的)


makefile里的注释符是#

makefile里的宏定义:

例子: CC=gcc  $(CC)

这里之所以要将gcc定义为宏是因为:

不同的系统下的编译器可能不同而我们如果在执行make时指定了CC的值,那么新的值将覆盖原来的值

一些特殊的宏定义:

$?

当前依赖文件列表中比目标还要新的文件


$@--目标文件,

$^--所有的依赖文件,

$<--第一个依赖文件

另外我们还经常在Makefile的命令看到下面两个符号

-告诉告诉make命令忽略所有的错误,@告诉make在执行某条命令前不要命令显示在标准输出上

另外make还内置大量的内置规则来简化编写,大家可以通过:make -p来查看这些规则

关于创建自己的规则 以让一个就的后缀名能生成新的后最名的文件,我们以.cpp到文件.cpp的生成作为例子就一目了然:

.SUFFIXES:    .cpp

.cpp.o:

$(CC)   -xc++ $(CFCLASS) -i$(INCLUDE) -c $<

其中的-xc++ 就是告诉gcc编译器这是一个C++源文件

Makefile中的如果想用库文件包含一个源文件只需要:.a(.o)的形式就好了


有时候我们需要将构成库文件的几个从其他文件中分离出来放在一个子文件中

我们可以在子目录中编写第二个Makefile文件这个文件就是将几个文件包含到库文件中去,然后在主文件中加入:

mylib.a

   (cd mylibdirectory;$(MAKE))

这个规则的意思是 切换到然后执行另外的make,注意的是这个()很重要,它保证了两个命令都在同一个shell中被执行


最后要注意的是:

make -JN这个选项可以同时执行多个命令 (如:-j3)

gcc -MM 可以产生目标文件的依赖清单




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值