调用一个makefile并同时生成动静态库

实验题目:使用一个makefile对多个文件进行编译,生成动态库和静态库

实验要求:需要文件具有以下目录结构
调用一个makefile并同时生成动静态库_第1张图片

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

相关基础请先参考:使用makefile生成动态库和静态库

一、相关文件位置和名字

调用一个makefile并同时生成动静态库_第2张图片
图1:主目录

调用一个makefile并同时生成动静态库_第3张图片
图2:liba目录

调用一个makefile并同时生成动静态库_第4张图片
图3:libso目录

二、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)

三、.c、.h程序

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

四、结果

在这里插入图片描述

你可能感兴趣的:(linux,c语言)