Makefile小实验

文章目录

  • 目的
  • 构造项目框架
    • 目录结构
    • 编写c程序
    • 编写头文件
    • 第一次编译
  • 第一次改进:制作动态链接库
    • 制作动态链接库
    • 编译,生成可执行程序
  • 究极改进(Makefile的引入)
    • Makefile的引入
    • 编写Makefile
    • 运行结果
  • 总结

目的

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

构造项目框架

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

目录结构

在这里插入图片描述

编写c程序

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

功能函数
function.c

#include 
  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
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
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程序
Makefile小实验_第1张图片
查看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小实验_第2张图片
查看一下
在这里插入图片描述

总结

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

你可能感兴趣的:(c语言,算法,Makefile)