IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> 一个makefile生成动态库和静态库 -> 正文阅读

[开发工具]一个makefile生成动态库和静态库

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

实验要求:需要文件具有以下目录结构
在这里插入图片描述

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

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

一、相关文件位置和名字

请添加图片描述
图1:主目录

在这里插入图片描述
图2:liba目录

在这里插入图片描述
图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 <stidio.h>
#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

四、结果

在这里插入图片描述

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章           查看所有文章
加:2022-09-21 00:48:33  更:2022-09-21 00:52:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 21:51:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码