Linux 下makefile实战 ——编写真实的C项目

时间:2022-07-26
本文章向大家介绍Linux 下makefile实战 ——编写真实的C项目,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

Linux 下真实的C项目设计

文件目录说明

  • include 存放自己设计的.h头文件之所在
  • include/stack.h 栈所使用的头文件。文件中已经定义出其包含的功能函数。具体请查看文件注释
  • stack.c 栈的功能函数的实现文件。目前为空文件。
  • main.c 一个简单的主程序,调用自定义栈的功能测试入栈、出栈的功能。
  • Makefile make的控制文件。

实现Makefile

  • 实现make命令完成所有编译、链接工作
  • 实现make clean命令可以恢复代码为原始状态

运行结果

在windows下打开linux shell:

编译+链接,make一步到位(图中标号给出了文件生成的顺序):

我们看下makefile的内容:

main:main.o my_stack.o
	gcc main.o my_stack.o -o main
main.o:main.c
	gcc -c main.c
my_stack.o:my_stack.c
	gcc -c my_stack.c

clean:
	if [ -e  main ] ; then rm main ; fi
	if [ -n "ls *.o >/dev/null 2>&1" ] ; then rm *.o ; fi

make main 操作完成编译+链接

main.o 获得可执行文件main.o

my_stack.o 获得可执行文件mystack.o

make clean 操作删除所有已经编译的.o文件和main最终文件

接着来看main.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "include/stack.h"

int main()
{
	//测试手写的封装栈
    stack_clear();//初始化栈
	srand((unsigned)time(NULL));
    elem buf;
	for(int i=0;i<10;i++)
	{
		
		buf = rand()%100;
		stack_push(buf);
		printf("当前栈顶元素为:%dn",stack_top());
		printf("栈是否为空(0为不空,1为空):%dn",stack_empty());
		printf("当前栈的大小为:%dn",stack_size());
	}
    
    return 0;
}

main.c这部分代码是测试自己手写的封装栈,首先先初始化栈,接着for循环生成10个随机数,紧接着每次打印栈顶元素和栈的大小,顺带判断栈是否为空

再来看my_stack.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "./include/stack.h"
Stack stack;   //为了方便这里直接定义全局变量了,用局部变量的话在每个函数加上取地址符和声明就行了
void stack_pop(){   //元素出栈,此函数无返回值
    stack.top--;
}
void stack_push(elem buf){  //元素入栈
    stack.index[++stack.top] = buf;
}
int stack_empty(){//判空,如果栈为空的话返回1,否则返回0
    return stack.top == -1;
}
 
void stack_clear(){ ///清空栈
    stack.top = -1;
}
 
int stack_size(){   //求栈内元素数
    return stack.top+1;
}
elem stack_top(){   //返回栈顶元素
    return stack.index[stack.top];
}

my_stack.c是栈功能的实现函数,具体的实现内容则是根据大二上数据结构课程所学,这里就不再赘述

include 文件夹下 stack.h存放的则是一些预定义函数

#ifndef STACK_H_
#define STACK_H_
#define maxn 110//栈的最大值
typedef int elem;//方便修改数据类型
typedef struct 
{
    int top;    //栈顶的索引
    elem index[maxn];
}Stack;
void stack_pop();   //元素出栈,此函数无返回值
void stack_push(elem buf);//元素入栈
int stack_empty();//判空,如果栈为空的话返回1,否则返回0
void stack_clear();///清空栈
int stack_size(); //求栈内元素数
elem stack_top(); //返回栈顶元素

#endif

我们接着来看一下运行结果:

可以看到自己手写的栈功能运行正常,还没有出现大的bug~

测试一下make clean:

文件夹中的main main.o 已经stack.o都被删除了,makefile运行正常