【Linux系统】动静态库的制作

前言:

上文我们讲到了文件系统**【Linux系统】详解Ext2,文件系统-CSDN博客**

本文我们来讲讲动静态库的制作

库

【Linux】编译器gcc/g++及其库的详细介绍_linux gcc 有哪些库-CSDN博客

这篇文章的第4大点,简单是介绍了一下库的基本概念。

静态库

静态库的本质是一种归档文件,对所有.o文件进行了打包!

不需要使用者解包,而直接使用gcc/g++进行链接即可!

cs 复制代码
#先将所有的 .c文件编译出 .o问文件
hyc@hyc-alicloud:~/linux/动静态库的制作/new$ ls
mstr.c  mstr.h  my.c  my.h
yc@hyc-alicloud:~/linux/动静态库的制作/new$ gcc -c *.c
hyc@hyc-alicloud:~/linux/动静态库的制作/new$ ls
mstr.c  mstr.h  mstr.o  my.c  my.h  my.o


#再将全部 .o文件打包为静态库(不包含main函数!)
hyc@hyc-alicloud:~/linux/动静态库的制作/new$ ar -cr libmyc.a *o
hyc@hyc-alicloud:~/linux/动静态库的制作/new$ ls
libmyc.a  mstr.c  mstr.h  mstr.o  my.c  my.h  my.o

如上,静态库就这样制作完成了!

ar是归档工具,将多个.o文件打包成一个文件。选项:-rc表示replace and creat

进行链接:

我们要链接任何非标准库(包括第三方库、自己写的库)都必须指明**-L -l**!

-L:表示去哪里找库

-l:表示找那个库

cpp 复制代码
hyc@hyc-alicloud:~/linux/动静态库的制作/new$ ls
libmyc.a  mstr.c  mstr.h  mstr.o  my.c  my.h  my.o  test.c
hyc@hyc-alicloud:~/linux/动静态库的制作/new$ gcc -c *.c
hyc@hyc-alicloud:~/linux/动静态库的制作/new$ ls
libmyc.a  mstr.c  mstr.h  mstr.o  my.c  my.h  my.o  test.c  test.o
hyc@hyc-alicloud:~/linux/动静态库的制作/new$ gcc -o test test.o -L . -l myc
hyc@hyc-alicloud:~/linux/动静态库的制作/new$ ./test
0 1 2 3 4 5 6 7 8 9 

链接完成,形成可执行程序!

注:.h文件的意义就是作为方法手册

cpp 复制代码
hyc@hyc-alicloud:~/linux/动静态库的制作$ ls
lib  new test.c
hyc@hyc-alicloud:~/linux/动静态库的制作$ tree lib
lib
├── include
│   ├── mstr.h
│   └── my.h
└── mylib
    └── libmyc.a

3 directories, 3 files

hyc@hyc-alicloud:~/linux/动静态库的制作$ gcc -o test test.c -I ./lib/include -L ./lib/mylib -l myc
hyc@hyc-alicloud:~/linux/动静态库的制作$ ls
lib  new  test  test.c
hyc@hyc-alicloud:~/linux/动静态库的制作$ ./test
0 1 2 3 4 5 6 7 8 9 

当头文件并不在当前目录或系统中,就想要 -I选项

-I:表示去哪里找头文件。

补充:

库也是要被安装到系统中的!!!

我们正常使用库,是不可能像上面一样麻烦的!

只需要将头文件、库拷贝至系统文件下的默认路径,以后调用就只需要指明库名字即可。

默认路径:/usr/include,/lib64

动态库

cs 复制代码
hyc@hyc-alicloud:~/linux/动静态库的制作/new$ ls
mstr.c  mstr.h  my.c  my.h

#先将.c文件编译成.o
hyc@hyc-alicloud:~/linux/动静态库的制作/new$ gcc -fPIC -c *.c
hyc@hyc-alicloud:~/linux/动静态库的制作/new$ ls
mstr.c  mstr.h  mstr.o  my.c  my.h  my.o

#再将.o文件打包
hyc@hyc-alicloud:~/linux/动静态库的制作/new$ gcc -shared -o libmyc.so *.o
hyc@hyc-alicloud:~/linux/动静态库的制作/new$ ls
libmyc.so  mstr.c  mstr.h  mstr.o  my.c  my.h  my.o

编译为.o文件:fPIC:产生位置无关码(position independent code)

打包:与静态库使用ar打包不同,动态库依旧使用gcc进行打包,使用 -shared选项:表示生成共享库格式

进行链接:

cs 复制代码
hyc@hyc-alicloud:~/linux/动静态库的制作$ ls
lib  new  test.c
hyc@hyc-alicloud:~/linux/动静态库的制作$ tree lib
lib
├── include
│   ├── mstr.h
│   └── my.h
└── mylib
    ├── libmyc.a
    └── libmyc.so

3 directories, 4 files


hyc@hyc-alicloud:~/linux/动静态库的制作$ gcc -o test test.c -I ./lib/include -L ./lib/mylib -l myc
hyc@hyc-alicloud:~/linux/动静态库的制作$ ls
lib  new  test  test.c


hyc@hyc-alicloud:~/linux/动静态库的制作$ ./test
./test: error while loading shared libraries: libmyc.so: cannot open shared object file: No such file or directory

如上,我们依旧将所有位置信息告知,链接成功得到可执行程序!

但是当我们执行可执行程序时,却发现报错了!?libmyc.so不打开,不存在?为什么?

cs 复制代码
hyc@hyc-alicloud:~/linux/动静态库的制作$ ldd test
	linux-vdso.so.1 (0x00007fff3f37a000)
	libmyc.so => not found
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fbfed7ba000)
	/lib64/ld-linux-x86-64.so.2 (0x00007fbfed9f1000)

因为,我们只告诉了编译器gcc这些信息,但是并没有告诉操作系统!

静态库为什么这问题?因为静态库在加载的时候,就已经将库加载到可执行程序里面了!而动态库没有,执行时还需要去查找对应的库。

解决方法:

1.将我们写的库直接拷贝到操作系统中

2.建立软连接:在操作系统中新建一个同名库,并将其与我们自己的库建立软连接

3.创建/修改环境变量:LD_LIBRARY_PATH(导入库的路径)

4.ldconfig方案:配置/ etc/ld.so.conf.d/ ,更新ldconfig

补充:

1.动静态库同时提供,gcc/g++,默认是使用动态链接、动态库!

非要静态链接,只能使用 -static(静态库必须存在!)

只存在静态库,当然就默认静态链接了

2.Linux下,默认优先安装动态库

相关推荐
她说彩礼65万3 小时前
C语言 const的使用
java·服务器·c语言
JEECG低代码平台3 小时前
不买服务器也能异地组网:开源 P2WLAN 把两地电脑“插“进同一台路由器
运维·服务器·开源·开源软件
wdfk_prog3 小时前
LWIP教程 00:从网线上的电信号到 lwIP——PHY、MAC、DMA 与 `netif` 的完整边界
运维·网络·笔记·学习·ip
cehuishi95273 小时前
测绘外业调查如何正确的开展
运维·服务器·网络
lisanmengmeng3 小时前
NRPE 添加命令(三)
java·linux·服务器
zmsup3 小时前
从运维需求到产品能力:OpsArk Agent 的运维智能平台架构设计思路
运维·系统架构·agent·智能体·运维智能平台
人工智能培训3 小时前
数字孪生驱动大模型工业知识库:为具身机器人植入领域专业经验
大数据·linux·服务器·前端·人工智能
江屿风4 小时前
【Linux系统】【从菜鸟驿站到操作系统:一节课打通Linux重定向与缓冲区真相】流食般投喂
linux·运维·服务器·开发语言·笔记
今天要早睡_4 小时前
Linux 基础指令速查:从 ls 到 tar 的常用命令全解析
linux·运维·chrome
吴声子夜歌4 小时前
Docker入门与实战——核心概念与安装配置
运维·docker·容器