欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

linux下的makefile编程

程序员文章站 2024-01-23 14:21:04
...

linux下编程使用makefile文件

在谈makefile之前,先来看看下面几个小程序:

程序1:mytool1.c

#include"mytool1.h"
#include"stdio.h"
void mytool1_print(char* print_str)
{
    printf("This is mytool1 print %s\n", print_str);
}

程序2:mytool1.h

#ifndef _MYTOOL_1_H
#define _MYTOOL_1_H
void mytool1_print(char*);
#endif

程序3;mytool2.c

#include"mytool2.h"
#include"stdio.h"
void mytool2_print(char* print_str)
{
    printf("This is mytool2 print %s\n", print_str);
}

程序4:mytool2.h

#ifndef _MYTOOL_2_H
#define _MYTOOL_2_H
void mytool2_print(char* );
#endif

程序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 1
This is mytool1 print hello 2


我们先按照常用的编译做法,对五个文件分别编译。
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.c
gcc -c mytool2.c
gcc -c main.c

linux下的makefile编程
通过上面发现,生成main文件,我们编译了四次,太耗费时间,就是伟大的程序员开发了,makefile编程,可进行大量编译。下面进入makefile话题。
makefile是一种文本文件,跟平时的.c/.C或者.java文件一一样,不过makfile不加任何 后缀名,下面对上面的五个文件进行makefile编译。
用vim建立makefile文件。找到上面五个程序的的位置,用vim makefie建立文件,下面是makefile内容:。
mian:main.o mytool1.o mytool2.o
gcc -c 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

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

上面的解释:mian:main.o mytool1.o mytool2.o
gcc -c main.o mytool1.o mytool2.o

这两行意思为:第一行是生成的最终目标main ,而生成main文件,是通过main.o mytool1.o mytool2.o文件实现的。换句话说,main 文件依赖main.o mytool1.o mytool2.o文件。
第二行给出,生成main文件的方法,是通过gcc -c main.o mytool1.o mytool2.o方法来生成的,
下面几行就不讲了,跟原理都是一样,先给出文件的依赖关系,再给出方法。

编写好makefile, 用输入命令make进行大量编译,会生成第一行的目标文件main。然后执行main。截图如下:

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

下面是精简后的makefile:
objects=main.o mytool1.o mytool2.o
main:$(objects)
gcc -o main$(objects)
main.o:main.c mytool1.h mytool2.h
gcc -o 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 $(objects)

下面的这句话是清除编译过程生成的.o文件, .o文件属于中间文件,可以删除。
clean:
rm *.o
zhe

输入make clean命令就可以清除全部.o文件。
截图如下: