详解Linux下静态库/动态库的生成和使用(含代码示例和操作流程)&&动态库和静态库的区别

这篇具有很好参考价值的文章主要介绍了详解Linux下静态库/动态库的生成和使用(含代码示例和操作流程)&&动态库和静态库的区别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

关于gcc的使用方法可以参考下方链接博客:
Linux下详解gcc编译过程(含代码示例)&& gcc使用教程

一、库的概念

  • 库是一种组件技术。
  • 库里封装了数据和函数,提供给用户程序调用。
  • 库只执行到第三阶段编译,没有链接。
  • 库的使用可以使程序模块化,提高程序的编译速度,实现代码复用。

Windows的库

Windows系统本身提供并使用了大量的库;
包括:静态库(.lib)和动态链接库(.dll)

Linux的库

· Linux系统通常把库文件存放在/usr/lib或/lib目录下,
· Linux库文件名组成:前缀lib + 库名 + 后缀(3部分组成)
————————————————————————————
动态库:以.so作为后缀
静态库:通常以.a.la作为后缀。


二、动态库和静态库的区别

1. 载入顺序不同

静态库的代码在编译时就拷贝到应用程序中,因此当多个应用程序同时引用一个静态库函数时,内存中将会调用函数的多个副本。其优点是节省编译时间。
动态库是在程序开始运行后且调用库函数时才被载入,被调函数在内存中只有一个副本,并且动态库可以在程序运行期间释放动态库所占用的内存。

2. 大小与共享的差异

静态链接库就是在程序编译的时候就被加载进来,这样的可执行文件会比较大一些,还不能共享 ;动态链接库是在程序执行的时候加载,可共享 。

3. 库函数调用的差异

静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分。
动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息(往往是一些重定位信息)。仅当应用程序被装入内存开始运行时,在linux的管理下,才在应用程序与相应的.so之间建立链接关系。当要执行所调用动态库中的函数时,根据链接产生的重定位信息,才转去执行动态库中相应的函数代码。


三、静态库的创建和使用

1. 创建静态库的步骤:

  1. 在一个头文件中声明静态库所导出的函数
  2. 在一个源文件中实现静态库所导出的函数
  3. 编译源文件,生成可执行代码(没有连接)
  4. 将可执行代码所在目标文件加入到某个静态库中,并将静态库拷贝到系统默认的存放库目录下(/usr/lib或/lib)。

(一)ar命令的使用方法

  • 作用:创建和修改静态库
  • 格式:ar [选项] 静态库名.a 目标文件1.o 目标文件2.o …

ar命令可用选项:

选项 说明
d 从库中删除成员
p 在终端上打印库中指定的成员
r 在库中加入新成员文件,如果要加入的成员文件存在,则替换之;默认情况下,新的成员文件增加在库的结尾处
t 显示库的成员文件清单
a 在库的一个已经存在的成员后面增加一个新的成员文件
c 创建一个库
i 在库的一个已经存在的成员前面增加一个新的成员文件
s 无论ar命令是否修改了库内容,都强制重新生成库符号表
x 从库中提取一个成员文件。如果不指定要提取的成员文件则提取库中所有的文件

(二)生成静态库的实例

(1)头文件mylib.h —— 声明静态库所导出的函数

#ifndef  _mylib_H_     //如果没有定义此标识符,编码以下程序
#define  _mylib_H_    1 
  void welcome();
  void outstring (const char * str);
#endif

(2) 对应于头文件的源文件mylib.c —— 实现静态库所导出的函数

#include “mylib.h”
#include <stdio.h>
void welcome() {
     printf (“welcome to libmylib\n”);
}
void outstring(const char * str) {
     if (str !=NULL)
         printf (%s”,str);
}

(3)编译mylib.c生成目标文件:
# gcc –o mylib.o –c mylib.c
注: -c是只编译而不生成可执行文件,-o指定文件名

更多关于gcc的使用方法可以参考下方链接博客:
Linux下详解gcc编译过程(含代码示例)&& gcc使用教程

(4)将目标文件加入到静态库中,静态库为libmylib.a
#ar rcs libmylib.a mylib.o

参数说明:
/* r —在库中加入新成员文件,如果要加入的成员文件存在,则替换之默认情况下,新的成员文件增加在库的结尾处
/* c 创建一个库
/* s 无论ar命令是否修改了库内容,都强制重新生成库符号表

(5)将静态库拷贝到 linux 的库目录(/usr/lib或/lib)下
#cp libmylib.a /usr/lib/libmylib.a

到这里静态库就生成完了,下面我们尝试用一个程序链接它。

2. 调用静态库的测试程序

简而言之就是:用一个.c源文件在编译时做静态链接

(一)调用静态库的测试程序:test.c

#include “mylib.h”
#include <stdio.h>
int  main()
   {
     printf (“create and use library:\n”);
     welcome();  //静态库中的函数原型
     outstring(“It’s successful\n”);  //静态库中的函数原型
}

(二)编译使用了库函数的程序

#gcc –o test test.c –lmylib

参数说明:
(1)选项l为链接选项说明在链接时就将静态库链接至源程序中
(2)在Linux中约定所有库都以前缀lib开始,静态库以.a结尾,动态库以.so结尾,在编译时,无需带上前缀(lib)和后缀(.a)。


四、动态库的创建和使用

注:动态库没有归档,在编译过程中就要生成符号表

  • 在Linux环境下,只要在编译函数库源程序时加上
    -fPIC -shared选项即可生成动态链接库。

1. 动态库的创建

# gcc –fPIC -o mylib.o -c mylib.c (生成符号表)
# gcc –shared -o libmylibs.so mylib.o(防止重复加载)

· 或者可以直接使用一条命令
# gcc –fPIC –shared –o libmylibs.so mylib.c (可以省略 -c 和 .o后缀文件名)

· 将生成的静态库拷贝至/usr/lib或/lib目录中
# cp libmylibs.so /usr/lib/libmylibs.so

2. 动态库的使用

(1)通过gcc命令调用
# gcc –o test test.c -lmylibs

(2)通过调用系统函数来使用动态链接库
总结动态库构建和使用的过程步骤,并分析动态库和静态库的区别(,Unix环境高级编程,Linux,操作系统,linux,windows,unix,运维,运维开发

其中:
dlopen函数的参数flag可取的值有:RTLD_LAZY、 RTLD_NOW、 RTLD_GLOBAL:

  1. RTLD_LAZY:在dlopen()返回前,对于动态库中存在的未定义的变量不执行解析,即不解析这个变量的地址
  2. RTLD_NOW:在dlopen返回前,解析出每个未定义变量的地址,如果解析不出来,dlopen会返回NULL,错误为“Undefined symbol:”
  3. RTLD_GLOBAL:使库中被解析出来的变量在随后的其它链接库中也可以使用,即全局有效

3. 通过调用系统函数来使用动态链接库的实例

创建testso.c文件:

#include <stdioh>
#include <dlfcn.h>
 int main (void)
{
  void *handle;
  char *error;
  void (*welcome)(); //要变成指针函数来用(由符号表引出的指针)
if ((handle = dlopen(/usr/lib/libmylibs.so”, RTLD_LAZY) == NULL)
  {
    printf (“dlopen error\n”);
    exit(1);
  }
welcome = dlsym(handle, “welcome”);
  if ((error = dlerror()) != NULL)
   {
     printf (“dlsym error \n”);
     exit(1);
   }
  welcome ();
  dlclose (handle);
  exit(0);
}

编译: #gcc –o testso testso.c -ldl
其中:-ldl 指明dlopen等函数所在的库类型文章来源地址https://www.toymoban.com/news/detail-608990.html

到了这里,关于详解Linux下静态库/动态库的生成和使用(含代码示例和操作流程)&&动态库和静态库的区别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 动态库和静态库的使用

    库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。就是将源代码转化为二进制格式的源代码,相当于进行了加密,别人可以使用库,但是看不到库中的内容。 常见的库类型 共享库 静态库 动态库 win32平台下,静态库通常后缀为.lib,动态库为.dll 。 linux平台下

    2024年02月03日
    浏览(67)
  • 动态库、静态库的构建与使用

    所谓静态、动态是指 链接 。回顾一下,将一个程序编译成可执行程序的步骤: 链接 : 把外部函数的代码(通常是后缀名为.lib和.a的文件),添加到可执行文件中。这就叫做连接(linking)。这种通过拷贝,将外部函数库添加到可执行文件的方式,叫做静态连接(static linki

    2024年02月06日
    浏览(33)
  • 【库函数】Linux下动态库.so和静态库.a的生成和使用

    目录 🌞1. Linux下静态库和动态库的基本概念 🌞2. 动态库 🌊2.1 动态库如何生成 🌍2.1.1 文件详情 🌍2.1.2 编译生成动态库 🌊2.2 动态库如何使用 🌍2.2.1 案例 🌍2.2.2 动态库错误记录 🌞3. 静态库 🌊3.1 静态库如何生成 🌍3.1.1 文件详情 🌍3.1.2 编译生成动态库 🌊3.2 静态库如

    2024年04月25日
    浏览(19)
  • 【嵌入式学习笔记-02】什么是库文件,静态库的制作和使用,动态库的制作和使用,动态库的动态加载

    【嵌入式学习笔记-02】什么是库文件,静态库的制作和使用,动态库的制作和使用,动态库的动态加载 单一模型: 将程序中所有功能全部实现于一个单一的源文件内部。编译时间长,不易于维护和升级不易于协作开发。 分离模型 将程序中的不同功能模块划分到不同的源文件

    2024年01月15日
    浏览(38)
  • Windows下C++静态链接库的生成以及使用

    这篇文章简单讨论一下Windows下如何使用VS生成和使用C++静态链接库,示例使用VS2022环境。 先创建C++项目-静态库 然后将默认生成的.h和.cpp文件清理干净,当然你也可以选择保留。 然后创建需要的.h和.cpp文件。 看下代码 很简单的代码,就是提供一个打印字符串的接口。编译一

    2024年02月05日
    浏览(26)
  • windows下qt使用第三方库(静态链接库lib)、静态库和动态库区别、动态库的使用。

    这里主要是讲述windows下qt使用第三方库。 windows下qt使用第三方库(静态链接库lib)。 为了能够使测试更准确,首先自己用qt创建了一个已经封装好的lib库。 然后让另一个项目去链接这个lib静态库,并且去调用里面的方法。 目的: 使 untitled项目 能够使用 myllplib.lib 静态库,这

    2023年04月17日
    浏览(74)
  • 【Linux从入门到精通】动静态库的原理与制作详解

         本篇文章主要是 围绕动静态库的原理与制作进行展开讲解 的。其中涉及到了 inode的概念引入和软硬连接 的讲解。会结合实际操作对这些抽象的概念进行解释,希望会对你有所帮助。 文章目录 一、inode 概念 二、软硬链接 2、1 软连接 2、2 硬链接 三、动静态库概念 3、

    2024年02月12日
    浏览(26)
  • C静态库的创建与使用详解

    C源程序需要经过预处理、编译、汇编几个阶段,得到各自源文件对应的 可重定位目标文件 ,可重定位目标文件就是各个源文件的二进制机器代码,一般是.o格式。比如:util1.c、util2.c及main.c三个C源文件,经过预处理器、编译器、汇编器的处理,就可以得到各自的目标文件u

    2024年02月08日
    浏览(24)
  • Linux 静态库的制作与使用

    1、 什么是库 库文件是计算机上的一类文件,可以简单的把库文件看成一种代码仓库,它提供使用者可以直接拿来用的变量、函数或类。 库是一种特殊的程序,编写库的程序和编写一般的程序区别不大,只是库不能单独运行。 库文件有两种,静态库和动态库(共享库),区

    2023年04月24日
    浏览(22)
  • 【linux】动静态库的使用与制作

    本章节是基础IO的的最后一个话题!! 我们有没有用过库? 答案是一定的,我们在使用printf,stl容器…等等函数都是在使用库, 不然的话我们在使用这些东西时,明明你自己没有实现,程序缺依然能执行呢? 都是因为库的存在! 既然知道了库的存在,那我们肯定要见一见。

    2024年04月27日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包