当前位置:首页 > C语言
静态库与动态库的实现
来源:靑龍一笑的博客  作者:靑龍一笑  发布时间:2022-10-29 20:14:35  点击量:114  评论:0

    在之前的《栈的链式存储实验》和《队列的链式存储实验》里复用了《线性表之双向链表实验》里的 dlinklist.h 和 dlinklist.c 文件,本篇以静态库和动态库的方式,再次实现代码复用。

一、静态库

1、dlinklist.h 文件

    详见我的另一篇文章《线性表之双向链表实验》。

2、dlinklist.c 文件

    详见我的另一篇文章《线性表之双向链表实验》。
    生成 dlinklist.o 文件:

root@RicenOS:~# gcc -c dlinklist.c

    生成 libdlinklist.a 静态库文件:

root@RicenOS:~# ar -cr libdlinklist.a dlinklist.o

    静态库以 lib 开头,以 .a 为后缀,中间 dlinklist 为库名。
    将头文件 dlinklist.h 拷贝到 /usr/local/include 目录下:

root@RicenOS:~# cp dlinklist.h /usr/local/include/

    将静态库文件 libdlinklist.a 拷贝到 /usr/local/lib 目录下:

root@RicenOS:~# cp libdlinklist.a /usr/local/lib/

    将测试文件 main.c 文件(详见我的另一篇文章《线性表之双向链表实验》)中的如下一行:

#include "dlinklist.h"

    修改为:

#include <dlinklist.h>

    使用静态库编译测试文件:

root@RicenOS:~# gcc -o main main.c -ldlinklist

    其中,-l 参数是调用库文件,必须放在最后。完整的命令如下:

root@RicenOS:~# gcc -L/usr/local/lib -o main main.c -ldlinklist

    之所以省略了 -L/usr/local/lib,这是因为静态库文件 libdlinklist.a 位于 /usr/local/lib 目录下,如果在其它目录,则必须指定。

root@RicenOS:~# ldd ./main
libdl.so
libc.so

二、动态库

1、dlinklist.h 文件

    详见我的另一篇文章《线性表之双向链表实验》。

2、dlinklist.c 文件

    详见我的另一篇文章《线性表之双向链表实验》。
    生成 libdlinklist.so 动态库文件:

root@RicenOS:~# gcc -shared -fpic -o libdlinklist.so dlinklist.c

    动态库以 lib 开头,以 .so 为后缀,中间 dlinklist 为库名。
    将头文件 dlinklist.h 拷贝到 /usr/local/include 目录下:

root@RicenOS:~# cp dlinklist.h /usr/local/include/

    将动态库文件 libdlinklist.so 拷贝到 /usr/local/lib 目录下:

root@RicenOS:~# cp libdlinklist.so /usr/local/lib/

    将测试文件 main.c 文件(详见我的另一篇文章《线性表之双向链表实验》)中的如下一行:

#include "dlinklist.h"

    修改为:

#include <dlinklist.h>

    此时,还需要将动态库文件所在目录添加到 /etc/ld.so.conf 文件里:

root@RicenOS:~# sed -i '1i/usr/local/lib' /etc/ld.so.conf

    执行动态链接库管理命令,让动态链接库为系统所共享:

root@RicenOS:~# ldconfig

    使用动态库编译测试文件:

root@RicenOS:~# gcc -o main main.c -ldlinklist

    完整的命令如下:

root@RicenOS:~# gcc -I/usr/local/include -L/usr/local/lib -o main main.c -ldlinklist

    之所以省略了 -I/usr/local/include,这是因为动态库的头文件 dlinklist.h 位于 /usr/local/include 目录下,如果在其它目录,则必须指定。

root@RicenOS:~# ldd ./main
libdlinklist.so
libdl.so
libc.so

    注意:当动态库与静态库重名时,优先链接到动态库。

三、动态库依赖

1、linkstack.h 文件

    详见我的另一篇文章《栈的链式存储实验》。

2、linkstack.c 文件

    详见我的另一篇文章《栈的链式存储实验》。
    生成 liblinkstack.so 动态库文件:

root@RicenOS:~# gcc -shared -fpic -o liblinkstack.so linkstack.c

    将头文件 linkstack.h 拷贝到 /usr/local/include 目录下:

root@RicenOS:~# cp linkstack.h /usr/local/include/

    将动态库文件 liblinkstack.so 拷贝到 /usr/local/lib 目录下:

root@RicenOS:~# cp liblinkstack.so /usr/local/lib/

    将测试文件 main.c 文件(详见我的另一篇文章《栈的链式存储实验》)中的如下一行:

#include "linkstack.h"

    修改为:

#include <linkstack.h>

    使用动态库编译测试文件:

root@RicenOS:~# gcc -o main main.c -llinkstack -ldlinklist

    其中,-l 参数是调用库文件。注意,这里有个依赖的先后顺序。

版权所有 © 2005-2023 靑龍一笑的博客  Powered by C.S.Ricen
Copyright © 2005-2023 by www.ricensoftwares.com.cn  All Rights Reserved.

欢迎光临本站,这里是靑龍一笑的博客。

因资金匮乏,本站已迁到国外的免费空间,可能导致本站的访问速度较慢,由此给您带来的不便,敬请谅解。

您可以通过下方的“支持本站建设”链接,给本站提供资金支持。

Free Web Hosting