实验题目:使用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,如果不能正常运行,则代表动态库生成成功。