实验题目:使用一个makefile对多个文件进行编译,生成动态库和静态库
实验环境与工具:Linux、ubuntu20、gcc7.4.0、secureCRT4.0、notepad++
相关基础请先参考:使用makefile生成动态库和静态库
TARGET := main
SOURCE := main.c
PWD_A := ./liba
SOURCE_A := $(wildcard $(PWD_A)/*.c)
OBJSA_A := $(PWD_A)/*.o
OBJSB_A := $(patsubst %.c,%.o,$(SOURCE_A))
TARGET_A := $(PWD_A)/libfunc_a.a
$(indo $(SOURCE_A))
PWD_SO := ./libso
SOURCE_SO := $(wildcard $(PWD_SO)/*.c)
OBJSA_SO := $(PWD_SO)/*.o
OBJSB_SO := $(patsubst %.c,%.o,$(SOURCE_SO))
TARGET_SO := $(PWD_SO)/libfunc_s.SO
#compile and lib and link parameter
CC := gcc
LDFLAGS := -L./liba/ -L./libso/
LIBS := -lfunc_a -lfunc_s
INCLUDE := -I./liba/ -I./libso
AR := ar
all: $(TARGET_A) $(TARGET_SO) $(TARGET)
#.a_link
$(TARGET_A):$(OBJSB_A)
#注意下面的命令需要先使用 Tab 键,再输入命令
$(AR) -r $@ $^
#complie
$(OBJSA_A):$(SOURCE_A)
$(CC) -c $^ -I./liba/
#.so_link
$(TARGET_SO):$(OBJSB_SO)
#注意下面的命令需要先使用 Tab 键,再输入命令
$(CC) -shared -fpic $^ -o $@
#complie
$(OBJSA_SO):$(SOURCE_SO)
$(CC) -c -fpic $^ -I./libso
#link
$(TARGET):$(OBJSB)
#注意下面的命令需要先使用 Tab 键,再输入命令
$(CC) $^ -o $@ $(INCLUDE) $(LDFLAGS) $(LIBS)
#clear
rm -fr $(OBJSB_A) $(OBJSB_SO)
rm -fr $(TARGET) $(TARGET_A) $(TARGET_SO)
1.使用命令 vim main.c 建立main.c文件
#include
#include "myMinus.h"
#include "myMulti.h"
#include "myAdd.h"
#include "myMod.h"
int main()
{
int num1 =2;
int num2 =5;
int minusValue = 0;
int multiValue = 0;
int addValue = 0;
int modValue = 0;
minusValue= myMinus(num1,num2);
printf("this is share library %d - %d = %d\n", num1, num2, minusValue);
multiValue= myMulti(num1,num2);
printf("this is static library %d * %d = %d\n", num1, num2, multiValue);
addValue= myAdd(num1,num2);
printf("this is share library %d + %d = %d\n", num1, num2, addValue);
modValue= myMod(num1,num2);
printf("this is static library %d mod %d = %d\n", num1, num2, modValue);
return 0
}
2.使用命令 vim myMinus.h建立头文件
int myMinus(int num1,int num2);
使用vim myMinus.c 建立myMinus.c文件
#include "myMinus.h"
int myMinus(int num1,int num2)
{
return num1 - num2;
}
3.使用命令 vim myMinus.h建立头文件
int myMulti(int num1,int num2);
使用vim myMulti.c 建立myMulti.c文件
#include "myMulti.h"
int myMulti(int num1,int num2)
{
return num1 * num2;
}
4.使用命令 vim myMinus.h建立头文件
int myAdd(int num1,int num2);
使用vim myAdd.c 建立myAdd.c文件
#include "myAdd.h"
int myAdd(int num1,int num2)
{
return num1 + num2;
}
5.使用命令 vim myMinus.h建立头文件
int myMod(int num1,int num2);
使用vim myMod.c 建立myMod.c文件
#include "myMod.h"
int myMod(int num1,int num2)
{
return num1 % num2;
}
如果 .c文件 在一个API调用另一个API(即myAdd调用myAdd2),本文的一次makefile文件则无法生成动静态库,暂不知道原因。但是如果动静态库分开生成,如本文链接那样进行,则没有问题。
原因:makefile生成的文件首要路径是makefile所在的当前路径,但是若指定生成动态库的中间文件的路径,就会破坏其自由位置的特性。
解决方案:将前面生成动态库的代码替换为如下版本
PWD_SO := ./libso
SOURCE_SO := $(wildcard $(PWD_SO)/*.c)
OBJS_SO := $(patsubst %.c,%.o,$(SOURCE_SO))
OBJECTS_SO := $(notdir $(OBJS_SO))
TARGET_SO := $(PWD_SO)/libfunc_s.SO
#.so_link
$(TARGET_SO):$(OBJECTS_SO)
#注意下面的命令需要先使用 Tab 键,再输入命令
$(CC) -shared -fpic $^ -o $@
#complie
$(OBJECTS_SO):$(SOURCE_SO)
$(CC) -c -fpic $^ -I./libso