程序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
通过上面发现,生成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。截图如下:
上面的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文件。
截图如下: