Makefile小实验

目的

简单的对Makefile进行的回顾,利用Makefile工具,方便程序的管理。同时对动态库的制作,链接等操作进行实际的展示

构造项目框架

这里只是一个较小的实验项目,所以我们就根据功能的设定进行建立文件。

目录结构

在这里插入图片描述

编写c程序

查看src目录结构
在这里插入图片描述

功能函数
function.c

#include <function.h>
  2
  3 int add(int a,int b){
  4         return a+b;
  5 }
  6
  7 int sub(int a,int b){
  8         return a-b;
  9 }

main.c

#include<function.h>
int main(){
                int a=10;
                int b=5;

                printf("a+b=%d\r\n",add(a,b));
                printf("a-b=%d\r\n",sub(a,b));
                return 0;
}

编写头文件

查看include目录结构
在这里插入图片描述function.h

#ifndef _FUNCTION_H_
#define _FUNCTION_H_
#include<stdio.h>
extern int add(int a,int b);
extern int sub(int a,int b);
#endif

第一次编译

回到我们的src目录,使用我们的gcc编译指令

gcc -o build function.c main.c -I ../include/

生成ELF可执行文件build并查看

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

执行build
在这里插入图片描述

第一次改进:制作动态链接库

通过分析上面的程序逻辑,我们可以知道main.c通过调用function.c中的函数来实现加法和减法。函数的声明在function.h头文件中进行声明。由main.c调用,function.c来实现。因此,我们可以清楚gcc编译器在编译的时候,将我们的main.c和function.c还有function.h都是放进了的。

为了方便代码的移植,提高程序执行速度。我们就想到了通过制作库文件的方法来提高程序的执行效率,实现协作共用。

制作动态链接库

这里就不制作静态库了。一般不用,而且方法一样,只是制作的指令不同

使用指令制作动态库libfunction.so

gcc function.c -fPIC -shared -o libfunction.so  -I ../include/

在这里插入图片描述
移动到我们的lib目录下

编译,生成可执行程序

 gcc -o build main.c -I ../include/ -L ../lib/ -lfunction -Wl,-rpath ../lib/

运行build程序
在这里插入图片描述
查看build
在这里插入图片描述

究极改进(Makefile的引入)

Makefile的引入

设想以下,如果我们的某个程序,function.c或者main.c突然想要再增加一个功能,或者再改进一下,用一个更好的算法。那岂不是我们就又要把之前的指令就又都给敲一遍,而往往我们的编程不可能总是一步到位,是需要经过多次调试和该进的,所以按目前的这个思路岂不是会让我们的开发效率变得异常的低下,需要我们把时间浪费反复敲这些指令上。显然这种车间工作我们是不愿意干的!
没错,大家肯定会想到可以用shell脚本啊!没错,这确实是一个比较好的办法,为什么是比较好呢?
设想一下,如果我们只有一个文件想要改一下,其他文件我并没有改,但是使用shell脚本就会使得我们把每一个文件都编译一次。又有同学会说,可以用if语句进行判断呀,可是如果文件很多的话,向bootloader,Linux kernel等。哪得写多少个if语句呀。

正因此Makefile诞生了,通过时间戳得概念,比较目标文件和依赖文件得最新修改时间,来决定是否需要再次编译该文件!

编写Makefile

src目录下的Makefile

CC := gcc
CLDFLAGS := -fPIC -shared -o

libfunction.so:function.c
        $(CC) $(CLDFLAGS) $@ $< -I ../include
        mv $@ ../
        mv main.c ../

总控Makefile,即Pri_Makefile目录下的Makefile

CC :=gcc
CFLAGS := -Wall -O2 -o
CLDFLAGS := -Wl,-rpath

.PHONY:all
all:build



build:
        $(MAKE) -C src
        $(CC) $(CFLAGS) $@ main.c -I include -L . -lfunction $(CLDFLAGS) .

.PHONY:clean
clean:
        mv main.c src
        rm build


运行结果

make一下
在这里插入图片描述
查看一下
在这里插入图片描述

总结

相信你已经对Makefile已经有了新的理解和使用操作了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jacky~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值