makefile 文件入门学习
我的感想吧,我们上linux的时候,各种心累没听多少,下来可真是花了可多心思研究这个ma'kefile 一天,感觉都快吐了,还是不会,自己各种试,搜。没有,是关键,自己动手,丰衣足食!
1.如果多个文件在同一个目录下,那么是最简单的;
首先:我们开始vim main.c //主函数
#include<stdio.h>
#include"head.h"
int main()
{
printf("%d\n",add(4,6);
printf("%d\n",sub(8,3);
return 0;
}
其次,我们再来 vim disply.c // 主要函数的实现
#include"head.h"
int add(int a,int b)
{
return a +b;
}
int sub(int a,int b)
{
if(a > b)
{
return a-b;
}
esle
{
return b - a;
}
}
最后。来vim一个声明
#ifndef _HEAD_H
#define _HEAD_H
int add(int ,int );
int sub(int ,int);
#endif
现在准备工作已经贮备好了:
在编写makefile之前先了解他的规则:
target(目标) : prerequisites(依赖条件) command(执行命令)
注意command前面的空白,不能用空格,需要按Tab键。
接下来:我们来编译一下:直接命令:make 当你ls时,你就会发现你已经多了两个 .o文件和可执行文件main ----------- 运行一下: ./main
结果:
我们执行一下:make clean 那些.o main都删除了
2. 如果你的文件全在不同的目录下,此时你怎么做:
准备条件: 首先先建立三个目录 ;mkdir Head 准备放个头文件
mkdir Test 准备放主函数
mkdir mk 函数的实现
cd 到Head 底下:vim heah.h
#ifndef _HEAD_H
#define _HEAD_H
int add(int a,int b);
int sub(int a,int b);
#endif
cd到Test 下放主函数: vim main.c
#include<stdio.h>
#include"../Head/head.h"
int main()
{
printf("%d\n",add(4,6);
printf("%d\n",sub(8,3);
return 0;
}
cd到mk 放个函数实现吧: vim disply.c#include"../Head/head.h"
int add(int a,int b)
{
return a +b;
}
int sub(int a,int b)
{
if(a > b)
{
return a-b;
}
esle
{
return b - a;
}
}
其实仔细看,不难发现我们用的是一个的代码,只是这次放在三个不同的目录底下了而已。但是有点小不一样:(我已经标记出来了)既然函数内部有变动,那么makefile也得变动,这个会了,基本你就掌握
我们必须在主函数所在的目录下 vim makefile
方法一:
方法二:(易于修改)
大功搞成,现在就开始运行和make clean了!
最后,我想说的时,虽然很累,但是我觉得很值!
补充一点知识:
在一个大的软件工程里面,可能会有多个文件同时包含一个头文件,当这些文件编译链接成一个可执行文件时 ,就会出现大量“重定义”的错误。在头文件中实用#ifndef #define #endif能避免头文件的重定义。方法:例如要编写头文件test.h 在头文件开头写上两行:#ifndef _TEST_H #define _TEST_H//一般是文件名的大写 头文件结尾写上一行: #endif 这样一个工程文件里同时包含两个test.h时,就不会出现重定义的错误了。 分析:当第一次包含test.h时,由于没有定义_TEST_H,条件为真,这样就会包含(执行)#ifndef _TEST_H和 #endif之间的代码, 当第二次包含test.h时前面一次已经定义了_TEST_H,条件为假,#ifndef _TEST_H和 #endif之间的代码也就不会再次被包含,这样就避免了重定义了
