动静态库生成使用

news/2024/6/16 20:44:00 标签: c++, linux

       🔥🔥 欢迎来到小林的博客!!
      🛰️博客主页:✈️林 子
      🛰️博客专栏:✈️ Linux
      🛰️社区 :✈️ 进步学堂
      🛰️欢迎关注:👍点赞🙌收藏✍️留言

目录

  • 静态库和动态库
  • 静态库
    • 静态库的生成
    • 静态库的使用
  • 动态库
    • 生成动态库

静态库和动态库

  • 静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静 态库
  • 动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。
  • 一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文 件的整个机器码
  • 在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个 过程称为动态链接(dynamic linking)
  • 动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚 拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间。

静态库

静态库的生成

生成静态库,我们只需要把要打包的.o目标文件打包在一起生成静态库即可。

首先,我们要先有4几个.c和.h的文件。

add.c

#include "add.h"

int add(int x,int y)
{
  return x+y;
}

add.h

int add(int x,int y);

sub.c

#include"sub.h"

int sub(int x,int y)
{
  return x- y;
}

sub.h

int sub(int x,int y);

然后我们编写一个Makefile自动化构建工具。

libmymath.a:sub.o add.o
	ar -rc $@ $^
%.o:%.c
	gcc -c $<

.PHONY:clean
clean:
	rm -rf libmymath.a *.o output

.PHONY:output 
output:
	mkdir output 
	cp *.h output 
	cp libmymath.a output

libmymath.a:sub.o add.o :libmymath.a 这个静态库是依赖于sub.o,add.o。

ar -rc $@ $^ :生成静态库。

%.o:%.c :当前目录下所有的.o文件都依赖于.c文件。

gcc -c $< : 生成所有可生成的.o文件。

.PHONY:clean : 清除所有生成的文件。

.PHONY:output:把.h和静态库打包进一个文件夹。

然后我们make一下,就可以生成静态库了。

在这里插入图片描述

我们会发现,先生成.o文件,再通过.o目标文件打包成静态库libmymath.a。

然后我们使用output,把头文件和静态库打包进同一个文件夹。并且进入output文件夹。

在这里插入图片描述

静态库的使用

要使用静态库,我们要先有一个主函数。我们创建一个test.c的主文件。

#include<stdio.h>
#include"add.h"
#include"sub.h"

int main()
{
  int x = 10;
  int y = 20;
  int r1 = add(x,y);
  int r2 = sub(x,y);
  printf("%d + %d = %d",x,y,r1);
  printf("%d - %d = %d",x,y,r2);

  return 0;
}

那么我们还需要编译这个test.c文件,我们需要在编译的时候。指定它的库路径,和库名。

gcc test.c -L. -lmymath 编译

-L 要链接的静态库路径,.为当前路径

-l 要链接的静态库名,静态库名不包含开头的lib和结尾的.a/.so

编译完之后会生成一个可执行文件。

在这里插入图片描述

执行结果。

在这里插入图片描述

这里忘记换行了。但不影响。

动态库

生成动态库

生成动态库就简单多了。我们还是使用Makefile来自动化生成。

libmymath.so:add.o sub.o #libmymath.so 依赖于add.o sub.o
	gcc -shared -o $@ $^

#产生.o目标文件,程序内部的地址方案是: 与位置无关,库文件可以在内存的任何位置加载,而且不影响和其他程序的关联性
%.o:%.c
	gcc -fPIC -c $<

.PHONY:clean
clean:
	rm -r -f libmymath.so *.o lib 

.PHONY:output
output:
	mkdir lib 
	cp *.h lib 
	cp libmymath.so lib 

  • shared: 表示生成共享库格式
  • fPIC:产生位置无关码(position independent code)
  • 库名规则:libxxx.so

这样我们就生成了.so的动态库。

在这里插入图片描述

然后我们output打包一下。

在这里插入图片描述

和刚才一样,我们创建一个.c的主文件。

test.c:

#include<stdio.h>
#include"add.h"
#include"sub.h"

int main()
{
  int x = 10;
  int y = 20;
  int r1 = add(x,y);
  int r2 = sub(x,y);
  printf("%d + %d = %d",x,y,r1);
  printf("%d - %d = %d",x,y,r2);

  return 0;
}

然后我们使用makefile来生成自动化编译。

makefile:

test:test.c
	gcc -o $@ $^ -I. -L. -lmymath 

.PHONY:clean
clean:
	rm -f test

然后编译,执行。

在这里插入图片描述

这是在同一目录下可以直接执行,如果在不同目录下。则会报错。

与动态库不再同一目录

此时我的动态库在lib目录下,源文件与lib在同一目录下。这时我们要稍微修改一下Makefile。

test:test.c
	gcc -o $@ $^ -I./lib -L./lib -lmymath 

.PHONY:clean
clean:
	rm -f test

然后编译

在这里插入图片描述

提示我们编译失败,这是因为不在同一目录下。加载器无法找到动态库并把它加载到内存,这时候我们把动态库添加进环境变量即可。

格式:

export LD_LIBRARY_PATH= lib文件目录


http://www.niftyadmin.cn/n/5019329.html

相关文章

Flink DataStream 体系

前言 本文隶属于专栏《大数据技术体系》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和参考文献请见大数据技术体系 思维导图 正文 对 Flink 这种以流为核心的分布式计…

Go基础16-defer的运作机制及常见用法

defer的运作离不开函数&#xff0c;这至少有两层含义&#xff1a; ● 在Go中&#xff0c;只有在函数和方法内部才能使用defer&#xff1b; ● defer关键字后面只能接函数或方法&#xff0c;这些函数被称为deferred函数。defer将它们注册到其所在goroutine用于存放deferred函数…

MATLAB入门-数据的导入和导出

MATLAB入门-数据的导入和导出 注&#xff1a;本篇文章是课程学习笔记&#xff0c;课程链接为&#xff1a;头歌 常见的几个导入数据的方法 load函数 load函数专门用于引入MATLAB的.mat格式数据&#xff0c;十分的简单方便。 例如&#xff1a;一个-ASCII编码形式存储的数据文件…

算法与设计分析--实验一

蛮力算法的设计与分析&#xff08;暴力&#xff09; 这次是某不知名学院开学课程的第一次实验&#xff0c;一共5道题&#xff0c;来自力扣 第一题.216组合总和*力扣题目链接 第一道题是经典的树型回溯 class Solution { public:vector<vector<int>> combinatio…

C语言学习系列-->字符函数和字符串函数

文章目录 一、字符函数1、字符分类函数2、字符转换函数 二、字符串函数1、strlen概述模拟实现 2、strcpy概述模拟实现 3、strcat概述模拟实现 3、strcmp概述模拟实现 4、有限制的字符串函数strncpystrncatstrncmp 4、strstr概述模拟实现 一、字符函数 1、字符分类函数 包含头…

两数乘积:输出1~100整数乱序列表中两数乘积是目标整数的最小下标对

给定1~100整数的乱序列表&#xff0c;查找并输出乘积是用户指定整数的两个整数下标对。 (本笔记适合熟练掌握Python列表的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教…

nginx-日志处理

access.log #正常请求的日志 error.log #访问错误日志&#xff0c;404&#xff0c;500等请求在这里 buffer&#xff1a;设置缓冲区&#xff0c;访问日志不会直接打到磁盘上&#xff0c;而是先积攒到缓冲区&#xff0c;缓冲区满了后在统一往…

JS看板:bryntum taskboard 5.5.2 Crack

Bryntum 任务板是一个灵活的看板 Web 组件&#xff0c;可帮助您可视化和管理您的工作。 任务板非常灵活&#xff0c;允许您完全自定义卡片、列和泳道的渲染和样式。借助丰富的 API&#xff0c;您甚至可以在运行时打开或关闭功能。 在繁忙的团队中跟踪任务可能会令人畏惧。任务…