实验题目:使用makefile编译动态库和静态库
实验要求:需要文件具有目录结构,并满足本文最后一节的要求
在这里插入图片描述

注:先建立根文件夹main,放置main.c和makefile;在根文件夹中创建liba 和 libso文件夹 ,分别放置静态库文件和动态库文件

实验环境与工具:Linux、ubuntu20、gcc7.4.0、secureCRT4.0、notepad++

注 :makefile文件的目的:是将过多的shell命令,写入到makefile文件中,在编译的时候,输入 make 命令,就可以直接进行执行,避免了大量、多次的在Linux下输入命令。

一、静态库

在 liba文件夹 中进行创建

1.使用命令 vim division.h建立头文件,

//两数相除除法
int division(int num1,int num2);

2.使用vim division.c 建立.c文件

#include "division.h"
int division(int num1,int num2)
{
    return num1/num2;
}

3.使用命令 vim makefile 建立makefile文件,并输入以下以下内容

SOURCE      :=division.c
OBJS        :=division.o
TARGET      :=libc_a.a

#compile and lib parameter
CC			:=gcc
LIBS        :=
LDFLAGS     :=-L
DEFINES     :=
INCLUDE     :=-I
CFLAGS      :=
CXXFLAGS    :=

#link parameter
AR          :=ar;

#link
$(TARGET):$(OBJS)
#注意下面的命令需要先使用    Tab       键,再输入命令
	$(AR) -r $@ $^ 

#complie
$(OBJS):$(SOURCE)
	$(CC) -c $^ -o $@
#clear
	rm -fr *.o

4.在secureCRT中输入 make 命令,就能够生成静态库文件 lib_a.a 。

二、动态库

在 libso文件夹 中进行创建

1.使用命令 vim add.h建立头文件,

//两数相加
int add(int num1,int num2);

2.使用vim add.c 建立.c文件

#include "add.h"
int add(int num1,int num2)
{
    return num1+m2;
}

3.使用命令 vim makefile 建立makefile文件,并输入以下以下内容

SOURCE      :=add.c
OBJS        :=add.o
TARGET      :=libc_s.so

#compile and lib parameter
CC			:=gcc
LIBS        :=
LDFLAGS     :=
DEFINES     :=
INCLUDE     :=-I
CFLAGS      :=
CXXFLAGS    :=

#link
$(TARGET):$(OBJS)
#注意下面的命令需要先使用    Tab       键,再输入命令
	$(CC) -shared $^ -o $@
#注意上面命令,如果有问题换成 $(CC) -shared -o -fpic -o $^ $@

#complie
$(OBJS):$(SOURCE)
	$(CC) -c -fpic $^ -o $@
#clear
	rm -fr *.o

4.在secureCRT中输入 make 命令,就能够生成动态库文件 libc_s.so 。

三、主函数

在主目录文件中创建

1.使用命令 vim main.c 建立main.c文件

#include <stidio.h>
#include "divisio.h"
#include "add.h"

int main()
{
    int num1 =6;
    int num2 =2;
    int addValue=0;
    int divisionValue=0;
    divValue = division(num1,num2);
    printf("divisionValue=%d\n",divnValue);
    addValue =add(num1.num2);
    printf("addValue=%d\n",addValuee);
    return 0
}

2.使用命令 vim makefile 建立main的 makefile文件

SOURCE      :=main.c
OBJS        :=main.o
TARGET      :=main

#compile and lib parameter
CC			:=gcc
A_LDFLAGS   :=-L./liba/
A_LIBS      :=-lc_a
S_LDFLAGS   :=-L./libso/
S_LIBS      :=-lc_s
A_INCLUDE   :=-I./liba
S_INCLUDE   :=-I./libso
CFLAGS      :=
CXXFLAGS    :=

$(TARGET):$(OBJS)
#注意下面的命令需要先使用    Tab       键,再输入命令
	$(CC) $^ -o $@ $(S_LDFLAGS) $(S_LIBS) $(A_LDFLAGS) $(A_LIBS)
$(OBJS):$(SOURCE)
	$(CC) -c $^ -o $@  $(S_INCLUDE) $(A_INCLUDE)
#clear
	rm -fr *.o
	rm -fr $(TARGET)

四、主函数的编译与运行

1.在secureCRT中输入 make 命令后,就能够打印出相关信息

2.动态库添加

export LD_LIBRARY_PATH=/home/test/libso:$LD_LIBRARY_PATH

首先使用命令 cd ,将路径一路切换到动态库所在的文件中,接下来使用命令 pwd,查看动态库所在的绝对路径,即

/home/test/libso

并将该路径填充到=和:之间,再使用命令

ldd main

查看,动态库是否添加成功

3.删除静态库lib_a.a,如果可以正常运行,则代表静态库生成成功(保留动态库)。

4.删除动态库lib_so.so,如果不能正常运行,则代表动态库生成成功。

五、进阶—编写shell脚本文件

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐