makefile programming under linux

Programming under linux using makefile

 Before talking about makefiles, let's take a look at the following small programs:

Program 1: mytool1.

#include"mytool1.h"
#include"stdio.h"
void mytool1_print(char* print_str)
{
    printf("This is mytool1 print %s\n", print_str);
}
Program 2: mytool1.h
#ifndef _MYTOOL_1_H
#define _MYTOOL_1_H
void mytool1_print(char*);
#endif

Program 3; mytool2.c

#include"mytool2.h"
#include"stdio.h"
void mytool2_print(char* print_str)
{
    printf("This is mytool2 print %s\n", print_str);
}
Program 4: mytool2.h
#ifndef _MYTOOL_2_H
#define _MYTOOL_2_H
void mytool2_print(char* );
#endif

Program 5: main.c

#include"mytool1.h"
#include"mytool2.h"
int main(void)
{
    mytool1_print("hello 1");
    mytool2_print("hello 2");

    return 0;
}

Now we want to run main.c to print out
This is mytool1 print hello 1
This is mytool1 print hello 2

As shown, so the source file:


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

下图是编译过程和结果。

1.分别编译三个源文件



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



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



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 "进行大量编译,执行的顺序还是跟上面一样,截图如下:




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文件。




Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325605690&siteId=291194637