【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下,默认优先安装动态库

相关推荐
A小辣椒1 小时前
TShark:Wireshark CLI 功能
linux
A小辣椒5 小时前
TShark:基础知识
linux
AlfredZhao7 小时前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao1 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334661 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪1 天前
linux 拷贝文件或目录到指定的位置
linux
大树882 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠2 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质2 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush42 天前
嵌入式linux学习记录十四、术语
linux·嵌入式