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运行正常
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【我在拉勾训练营学技术】mysql 索引面试再也不怕啦
- 智能合约中常见的漏洞总结复现#技术创作101训练营#
- JS根据列表排列对象数组
- git提取两次提交或者版本的差异文件并打包成zip压缩包
- 博客通用版Live2d伊斯特瓦尔发布
- 一个小需求,自动重启k8s集群中日志不刷新的POD
- 多图,一文了解 8 种常见的数据结构
- Jenkins--pipline 流水线部署Java后端项目
- 微信小程序修炼之路LV1—工具介绍篇
- CentOS 7 部署OpenLDAP+FreeRadius
- 手把手教你使用yolo进行对象检测
- K8s之Helm工具详解
- 技术创作101训练营——上古神器Gvim--从入门到精通
- 关于linux7下编写crontab任务执行mysqldump备份无效
- 黑暗中的YOLO:解决黑夜里的目标检测 | ECCV 2020