linux make 无法生成 .o gch,linux下的makefile编程

程序5:main.c

#include"mytool1.h"

#include"mytool2.h"

int main(void)

{

mytool1_print("hello 1");

mytool2_print("hello 2");

return 0;

}

现在我们要运行main.c来打印输出This is mytool1 print hello 1This is mytool1 print hello 2

如图所示,所以源文件:

477daceebd3d2e062561caec6dfaea3d.png

我们先按照常用的编译做法,对五个文件分别编译。linux下的c/c++编译器是 gcc 和 g++, 不过,gcc使用的人比较多,这两个都能便于c和c++文件,下面以gcc编译为样例。

gcc 的编译格式大致为:gcc -c 源文件 -o 生成文件,方式不唯一,其中“ c ”的含义是英文单词 compile 编译的缩写,” o “的含义是英文单词out输出的缩写, 如果没有指定生成目标文件,编译器默认生成跟源文件同名的编译文件。

编译上面的例子:gcc -c mytool1.c -o mytool.o,这个命令是编译mytool1.c文件生成目标mytool1.o文件,这里生成文件mytool1其实可以写成任意的符号或者名称,如果写成gcc -c mytool1.c,系统默认生成mytool1.o文件,以下,是编译步骤:gcc -c mytool1.cgcc -c mytool2.cgcc -c main.c

下图是编译过程和结果。

1.分别编译三个源文件

06a8244f4bb7f2530c4fec779f828fb0.png

2.gcc main.o  -o  main  mytool1.o mytool2.o,这句命令是将三个.o文件链接成可执行的main 程序。输入./main执行程序。

d1955b95791d900122c88f6762254e8a.png

1、但是通过上面发现,生成main文件,我们需要编译了三次,太耗费时间。伟大的程序员开发了makefile编程,可进行大量编译。

makefile是一种文本文件,跟平时的.c/.C或者.java文件一一样,不过makfile不加任何 后缀名,

下面对上面的五个文件进行makefile编译。在上面程序的同一路径建立文件,文件名是makefile。

编辑makefile内容太。makefile内容是。

这里的mian是最终的可执行程序,名字随便写都行。我写成了mian。t

特别注意:gcc前面都是带有一个tab键的空格,这个不能少,少了就出错。尽量不要复制这几行代码,我的代码可能空格数不对,自己手到进去一个table键就行了。

mian:main.o mytool1.o mytool2.o

gcc -o mian main.o mytool1.o mytool2.o

main.o:main.c mytool1.h mytool2.h

gcc -c main.c

mytool1.o:mytoo1.c mytool1.h

gcc -c mytool1.c

mytool2.o:mytool2.c mytool2.h

gcc -c mytool2.c

f926585fbcac9554717380220564afbb.png

490ccaccf2dd129ed53cd80d851c2520.png

makefile内容的解释:

每两行为一句,前一行给出生成的文件名,和所需要的文件,后一行给出方法。

mian:main.o mytool1.o mytool2.o

gcc -o mian main.o mytool1.o mytool2.o

上面的代码解释为:

第一行解释:main 程序的生成是依赖main.o mytool1.o mytool2.o文件的。这行给出的是依赖关系。

第二行解释:这行给出了生成main程序的方法,方法是通过gcc -c main.o mytool1.o mytool2.o方法来生成的,下面几行就不讲了,原理都是一样,先给出文件的依赖关系,再给出方法。

编写好makefile, 用输入命令"  make "进行大量编译,执行的顺序还是跟上面一样,截图如下:

983b7008b2e1f921792d0a56f740ed7f.png

8be48ffedece450ffed5d3ca7a0beade.png

2.上面的makefile其实还是不够简练,,我们发现里面反复出现了main.o mytool.o mytool2.o, 于是我们可以找一个变量名来代替它,下面代替名是objects;

下面是精简后的makefile:内容如下:

objects=main.o mytool1.o mytool2.o

main:$(objects)

gcc -o mian $(objects)

main.o:main.c mytool1.h mytool2.h

gcc -c main.c mytool1.h mytool2.h

mytool1.o:mytool1.c mytool1.h

gcc -c mytool1.c

mytool2.o:mytool2.c mytool2.h

gcc -c mytool2.c

clean:

rm *.h.gch

rm *.o

每个gcc都必须一个tab键空格。还要注意图中的mian和$之间是有空格的,不加空格,编译会出错。

clean:

rm *.h.gch    rm  *.o上面的意思是清楚生成的.o文件和.h.gch文件,这些文件是中间文件,可以删除。

输入make clean命令就可以清除全部.o文件。

19d3b82286e6d6501eb220ff9a62e246.png

9c40515f9ba9e9675e63ae744b66528b.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值