精华内容
下载资源
问答
  • 2020-11-02 16:04:50

    一.动态库的基本概念

    1. 动态链接库是程序运行时加载的库,当动态链接库正确安装后,所有的程序都可以使用动态库来运行程序。动态链接库是目标文件的集合,目标文件在动态链接库中的组织方式是按照特殊方式形成的。库中函数和变量的地址是相对地址,不是绝对地址,其真实地址在调用动态库的程序加载时形成。

    2. 动态链接库的名称有别名(soname), 真名(realname)和链接名(linker name)。别名由一个前缀lib,然后是库的名字,再加上一个后缀“.so”构成。真名是动态链接库真实名称,一般总是在别名的基础加上一个小版本号,发布版本等构成。除此之外,还有一个链接名,即程序链接时使用的库的名字。

    3.在动态链接库安装的时候,总是复制文件到某个目录下,然后用一个软连接生成别名,在库文件进行更新的时候,仅仅更新软链接即可。

    二.生成和使用动态库

    1.看一个实例来了解如何自己生成静态库和使用静态库

    创建程序文件

    1>在test文件夹下有三个文件: main.c ,add.c,sub.c,tiger.h

    2> main.c文件中的内容:

    点击(此处)折叠或打开

    01    #include<stdio.h>
    02    
    03    #include”tiger.h”
    04    
    05    int main(void)
    06    {
    07     printf(“sum =%d\n”,add(5,3));
    08     printf(“sub= %d\n”,sub(5,3));
    09    
    10     return 0;
    11    }
    

    3>.tiger.h文件中的内容:

    点击(此处)折叠或打开

    1    #ifndef __TIGER__
    2    #define __TIGER__
    3    
    4    int add(int a,int b);
    5    int sub(int a,int b);
    6    
    7    #endif
    

    4>.add.c文件中的内容

    点击(此处)折叠或打开

    1    int add(int a, int b)
    2    {
    3     return a +b;
    4    }
    

    5>.sub.c文件中的内容

    点击(此处)折叠或打开

    1    int sub(int a, int b)
    2    {
    3     return a - b;
    4    }
    
    

    动态库的生成

    1>首先生成目标文件,但是此时要加编译器选项-fpic和链接器选项-shared,

    gcc -fpic -c add.c

    gcc -fpic -c sub.c

    生成中间文件add.o和sub.o

    2>其次生成动态库

    gcc -shared –o libtiger.so add.o sub.o

    生成动态库libtiger.so,libtiger.so就是我们生成的目标动态库。我们以后使用动态库和main.c程序生成可执行程序

    说明:

    以上两部也可以合成一步搞定:

    gcc -fpic -shared add.c sub.c -o libtiger.so

    2.使用动态链接库

    在编译程序时,使用动态链接库和静态库是一致的,使用”-l库名”的方式,在生成可执行文件的时候会链接库文件。

    1>使用命令:

    gcc -o main main.c -L ./ -ltiger

    2>-L指定动态链接库的路劲,-ldtiger链接库函数tiger。-ltiger是动态库的调用规则。Linux系统下的动态库命名方式是lib*.so,而在链接时表示位-l*,*是自己命名的库名。

    3>但是程序会提示如下错误

    error while loading shared libraries: libtiger.so: cannot open shared object file: No such file or direct

    这是因为程序运行时没有找到动态链接库造成的。程序编译时链接动态库和运行时使用动态链接库的概念是不同的,在运行时,程序链接的动态链接库需要在系统目录下才行。

    4>使用以下方法可以解决此问题

    a. 在linux下最方便的解决方案是拷贝libtiger.so到绝对目录 /lib 下(但是,要是超级用户才可以,因此要使用sudo哦,亲)。就可以生成可执行程序了

    b.第二种方法是:将动态链接库的目录放到程序搜索路径中,可以将库的路径加到环境变量LD_LIBRARY_PATH中实现:

    export LD_LIBRARY_PATH=pwd:$LD_LIBRARY_PATH

    执行此命令后也可以生成可执行程序

    更多相关内容
  • 文章目录一、概述二、动态库的优缺点三、动态库的制作(1)制作步骤(2)实际操作四、动态库 ...对速度要求不是很强烈的地方都应使用动态库 注意事项: 动态库是否加载到内存,取决于程序是否运行 命

    一、概述

    在这里插入图片描述

    二、动态库的优缺点

    机制:

    • 共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。

    优点:

    • 节省内存(共享)
    • 易于更新(动态链接)
      • 停止运行程序
      • 使用新库覆盖旧库(保证新旧库名称一致,接口一致)
      • 重新启动程序

    缺点:

    • 延时绑定,速度略慢

    使用场合:

    • 对速度要求不是很强烈的地方都应使用动态库

    注意事项:

    • 动态库是否加载到内存,取决于程序是否运行

    命名格式:

    1. lib开头
    2. 动态库名
    3. .so结尾

    三、动态库的制作

    (1)制作步骤

    1)生成“与位置无关“的目标文件。

    gcc -fPlC a.c b.c c.c -c
    
    • 参数:-PIC 表示生成与位置无关代码
    • 执行完毕后生成一系列的 .o 文件

    2)制作动态库

    gcc -shared -o libmytest.so a.o b.o c.o
    
    • 参数:-shared 制作动态库
    • -o:重命名生成的新文件

    3)使用动态库

    gcc main.c -L ./ -Imytest -I / -o app
    
    • -L–>指定库所在的路径
    • 去掉前缀 lib
    • 去掉后缀 .so
    • 只留下中间部分
    • -I–>头文件目录位置

    /.app–>运行失败

    • 查看依赖的共享库:ldd app 发现 libmytest 找不到
    • 没有给动态链接器(ld-linux.so.2)指定好动态库 libmytest.so 的路径
    • 解决方案
      1. 临时设置:export LD_LIBRARY_PATH=库路径,将当前目录加入环境变量,但是终端退出了就无效
      2. 永久设置:将上条写入家目录下 .bashrc 文件中
      3. 粗暴设置:直接将 libmytest.so 文件拷贝到 /usr/lib/【/lib】目录下。(受 libc 库的启发)
      4. 将 libmytest.so 所在绝对路径追加入到 /etc/ld.so.con 文件,使用 sudo ldconfig-v 更新

    (2)实际操作

    • 生成 .o 目标文件,文件路径和内容同上,进入到 src 目录,生成 .o 目标文件:
      在这里插入图片描述
    • 将 .o 文件打包生成动态库
      在这里插入图片描述
    • 使用生成的动态库,-L 指定动态库路径 -l 指定库名
    gcc main.c -o main -I include/ -L ./lib -lCalc
    
    • 退出到 dongtai 目录下,将动态库拷贝到 lib 目录下并编译 main.c 并执行 main:
      在这里插入图片描述
      无法找到动态库目标文件,解决方法有三个:

    (1)拷贝到 /lib 下(不允许,容易与别人库命名重合)
    在这里插入图片描述
    (2)将库路径增加到环境变量 LD_LIBRARY_PATH 中(不是特别推荐)
    在这里插入图片描述
    (3)配置 /etc/ld.so.conf 文件,增加 /home/linux/dongtai/lib/ 路径,执行 ldconfig -v,并执行 main
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    四、动态库

    在这里插入图片描述

    展开全文
  • VS2015动态库使用示例

    千次阅读 2018-11-04 10:39:06
    已经写好并且可以进行复用的代码,按照链接方式可分为两种 :动态库和静态库。他们在链接时起作用。   静态库:使用静态链接方式,库中的所有数据代码都将拷贝到调用程序的代码空间中去。也就是说你在哪调用了库...

    一、库基础知识

    已经写好并且可以进行复用的代码,按照链接方式可分为两种 :动态库和静态库。他们在链接时起作用。

                     

    静态库:使用静态链接方式,库中的所有数据代码都将拷贝到调用程序的代码空间中去。也就是说你在哪调用了库中的函数,                        它会将被调用的函数的的数据代码全部拷贝到该位置。在链接阶段就直接打包进可执行文件中。

    动态库:用动态链接方式,在链接时dll并不拷贝入最终生成的.exe。在程序运行需要调用dll时,才会加载。

    总之一句话:动态链接相比于静态链接,生成的可执行文件要小,但是运行时调用库所花费的时间要长。

    (好了,让我真刀真枪的干上一场吧哈哈哈)

     

    二、VS2015使用动态库简单示例

    1.打开V2015 -> 建立win32项目

    2.点击下一步

    3.选择DLL->选择导出符号(方便初学者使用) -> 选择下一步(当然附加选项可以选上 导出符号 ,会多一个接口,一般我是自己写接口的)

    4.开始编写一个简单的库例程

    我书写的是一个HELLO函数

    1.在DLL_Project.cpp中添加如下函数内容

    2.在DLL_Project.h中添加如下函数声明

    3.点击生成解决按方案

    出现如下文件,拷贝复制到你需要这个库的工程的可执行文文件同级目录下

    4.添加.lib,点开工程属性->链接器->常规->附加库目录->浏览选择你.lib的路径(当然也可以添加相对路径,移植性更高,这里使用绝对路径)

    5.点开 链接器 下的 输入 选项 -> 附加依赖项 -> 填写你的.lib全名

    6.调用运行啦

    运行结果

    到这你是不是觉得结束了?那你就太天真了,就没有想过为什么我创建一个DLL工程,为啥会出现一个.lib嘛

    哈哈哈哈,好好解释下

     

    静态库:在vs中新建生成静态库的工程,编译生成成功后,只产生一个.lib文件


    动态库:动态链接库是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。在vs中新建生成动态库的工程,编译成功后,产生一个.lib文件和一个.dll文件

    静态库中的lib:该LIB包含函数代码本身(即包括函数的索引,也包括实现),在编译时直接将代码加入程序当中
    动态库中的lib:该LIB包含了函数所在的DLL文件和文件中函数位置的信息(索引),函数实现代码由运行时加载在进程空间中的DLL提供
    总之,lib是编译时用到的,dll是运行时用到的。如果要完成源代码的编译,只需要lib;如果要使动态链接的程序运行起来,只需要dll。
     

    参考https://blog.csdn.net/qq_17239003/article/details/78482145

    特此鸣谢

     

    展开全文
  • 创建和使用动态库 使用def文件

    万次阅读 2017-08-01 08:53:34
    这个是vs2013自动生成的,但是你在建立项目的时候,选择了空项目,所以就没有,如果没选择空项目就会有这个文件,但是他会包含很多的其他的依赖文件,这里都去除了,我们是要生成一个纯净的动态库, // dl

    打开vs2013 ,文件-新建,取一个名字

    我们这里创建一个空的项目吧

    添加头文件MyDll.h

    源文件

    建立源文件dllmain.cpp,要包含window.h文件,这个是vs2013自动生成的,但是你在建立项目的时候,选择了空项目,所以就没有,如果没选择空项目就会有这个文件,但是他会包含很多的其他的依赖文件,这里都去除了,我们是要生成一个纯净的动态库,

    // dllmain.cpp : 定义 DLL 应用程序的入口点。
    #include <windows.h>
    BOOL APIENTRY DllMain(HMODULE hModule,
        DWORD  ul_reason_for_call,
        LPVOID lpReserved
        )
    {
        switch (ul_reason_for_call)
        {
        case DLL_PROCESS_ATTACH:
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
        }
        return TRUE;
    }

    建立source.def

    在此文件第一行引号中填项目名称就好了,EXPORTS下面表示要生成的函数名称 格式:“名称 @序号”)

    生成解决方案,发现该项目目录下的Debug下生成了文件  dll   lib

      

    2   项目调用库文件的用法

     以同样的方式生成项目,但这次不是选择dll了,控制台程序

    将上面项目的头文件和生成的库文件复制到该项目来

    建立自己的源文件UseDll.cpp  内容是

    有时候需要经文件包含的目录和库文件添加进来

    运行

    测试成功了

    如果我在库文件中这样写

    生成的库文件再拿过来

     

    展开全文
  •  如果没有使用其它的依赖库或者其它开源代码,那么可以直接按照gcc编译器生成和使用静态/动态库的方式。可以参考博客: https://blog.csdn.net/arackethis/article/details/43340065 按照这篇博客里面的操作,...
  • 什么是动态加载? 之前我们都是用的是自动加载,他是在exe运行启动时,就加载dll。...如何使用动态加载? 首先我们对之前的dll文件做一个小改动,因为动态加载无需声明头文件(*.h),所以所以...
  • 动态库使用的几个注意点

    千次阅读 2016-11-13 13:35:18
    一、“--export-dynamic”参数的使用GCC编译可执行文件时可以使用-Wl,--export-dynamic参数,此时链接器产生可执行文件时会将所有全局符号导出到动态符号表。gcc -Wl,--export-dynamic -o p1 p1.c -L. -l0如果在创建...
  • 说明前言我们经常会在动态库使用一些资源文件,例如 qss 文件、 png 文件,以达到美化界面的效果,刚刚使用 Qt 创建动态库的朋友可能会发现, 在代码中无法添加 qrc 资源文件中的图片资源。 显然,这会给我们带来...
  • 链接静态库,禁止使用动态库 -shared 进行动态库编译,链接动态库 -Ldir 在动态库的搜索路径中增加dir目录 -lname 链接静态库(libname.a)或动态库(libname.so)的库文件 -fPIC(或fpic) 生成...
  • 创建MFC项目时,选择动态库和静态库的区别动态库在VS2017版本中,选择的时候是叫“在共享DLL中使用MFC”。这样创建的时候生成的*.exe文件一般较小,原因有几点1. 此*.exe程序内部,一般不会包含文件所需要的库,其...
  • 动态库学习

    千次阅读 2020-02-26 16:54:48
     我们知道程序编译链接经常使用动态,同时我们可能还知道,动态库时程序运行时加载的。但是动态库到底有什么作用,如何生成、如何加载等,我们却很少关注。接下来,我给大家做一个简单的介绍。 1.1 动态库和静态库...
  • ,因此在程序运行时还需要动态库存在。   因为我的虚拟机没有安装vs,电脑找不到程序使用的这个库(这个库是vs自带的),所以就没办法运行。 我们只需设置为静态编译即可,让dll写进exe内,没有外部库也...
  • 阅读目录gcc -lXXX 如何选择静态库还是动态库?gcc 混合连接动态库和静态库gcc优先链接动态库,找不到,才链接静态库共享库文件在/usr/lib/目录下, 但是程序运行的时候还是找不到是为什么?2 个回答Linux设置和查看...
  • 4 动态库的加载及调用 动态库的加载分为静态加载、动态加载两种方式。 4.1 静态加载动态库 静态加载动态库的步骤包括:设置项目附加库目录;设置项目附加依赖项;移动DLL文件以及声明动态库的导出函数。 创建...
  • C++静态库与动态库的区别

    千次阅读 2019-08-31 16:11:52
    是——让大家学会创建与使用静态库、动态库,知道静态库与动态库的区别,知道使用的时候如何选择。这里不深入介绍静态库、动态库的底层格式,内存布局等,有兴趣的同学,推荐一本书《程序员的自我修养——链接、装载...
  • vs生成动态库使用动态库

    万次阅读 2017-05-25 21:51:30
    动态库(.dll):动态库又称动态链接库英文为DLL,是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可...
  • 本文介绍了Linux下Qt、动态库、静态链接库的创建以及使用的两种方法(显示链接及隐式链接),分享了在使用显示链接中遇到的坑及解决办法,希望能帮到大家。
  • Linux动态库和静态库

    万次阅读 多人点赞 2021-10-28 10:56:35
    文章目录动静态库的基本原理认识动静态库动静态库各自的特征静态库的打包与使用打包使用动态库的打包与使用打包使用 动静态库的基本原理 动静态库的本质是可执行程序的“半成品”。 我们都知道,一堆源文件和...
  • 本文的目的是测试各种类型库的编译后的使用效果,包括库又链接其他库的编译方法,使用方法,依赖性等。 太长不看版:请跳至文章最后的总结对比表。...④动态库libbb.so依赖动态库libaa.so的测试; ...
  • iOS之深入解析静态库和动态库

    千次阅读 2021-08-31 15:06:18
    一、 ① 什么是就是程序代码的集合,将 N 个文件组织起来,是共享程序代码的一种方式。 从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。 ② 的分类 根据程序代码的开源情况,...
  • Linux动态库依赖其它动态库的问题

    千次阅读 2019-11-15 11:17:45
    1 前言 这两天在编写一个插件系统Demo的...这个报错翻译过来就是没有在命令行中指定该动态库。 这个报错就很搞事了,你说你明明知道需要哪个库,为什么不直接帮我链接呢,非得我显示的在命令行中指定呢? 2 现象描...
  • Ubuntu 生成lua 动态链接

    千次阅读 2020-05-24 09:19:54
    说明:lua官方只提供静态链接,需要自己生成需要的动态链接,步骤如下: 操作如下: 下载lua源码,我目前使用的是lua 5.3.5版本 修改源码src目录下的Makefile文件: 在顶层目录下修改Makefile文件: 打开...
  • 005 - 使用 CMake 生成动态库/静态库

    千次阅读 2021-06-03 16:36:09
    使用 CMake 生成动态库/静态库 文章目录使用 CMake 生成动态库/静态库先看例子简单解释一下一些目前能想到的点对外提供动态库 先看例子 废话不多说,上 CMakeLists.txt cmake_minimum_required(VERSION 3.16) ...
  • Linux动态链接 so文件的创建与使用

    千次阅读 2019-02-17 13:45:02
    Linux动态链接 so文件的创建与使用
  • C语言中动态库/静态库的创建和使用

    千次阅读 2020-07-03 16:57:20
    C语言程序在开发过程中通常会使用遇到动态库或者是静态库函数的创建和使用,这里做简要的记录。 A.静态库函数的创建 1.源文件getSum.c #include "getSum.h" int getSum( int a, int b ) { return a + b; } 2....
  • 今天要把算法包生成一个动态库放在ARM上调用运行,特此记录一下给大家参考 1、首先将算法文件夹中的源程序生成.o文件 arm-linux-gnueabi-gcc -c -fpic *.c -I. //加-I.的原因在于要用到包中有头文件 {}CC}视自己的...
  • 静态库与动态库之间的区别

    千次阅读 2019-01-15 11:23:47
    什么是库      库是写好的,现有的,成熟的,可以复用的代码。...库有两种:静态库(.a、.lib)和动态库(.so、.dll)。  所谓静态、动态是指链接。回顾一下,将一个程序编译成可执行程序的步骤:   ...
  • c语言中存在静态库(.a)和动态库(.so)。 静态库实际上是一些目标文件的集合,只用于链接生成可执行文件阶段。链接器会将程序中使用到函数的代码从库文件中拷贝到应用程序中,一旦链接完成生成可执行文件之后,在执行...
  • VS2010 中编写动态库和调用动态库

    千次阅读 2018-11-12 23:05:42
    ... VS2010 中编写动态库和调用动态库 百度查了一下在VS中编写动态库的方法,亲测有效。 (1)启动VS2010》文件》新建》项目,按下图进行选择填写,选择Win32控制台应...
  • LINUX下动态库调用静态库的方法

    千次阅读 2016-03-18 14:04:55
    LINUX下动态库调用静态库的方法 有这样一种情形,在创建一个动态库的同时,可能会调用一个静态库,这个静态库可能是你自己写的,也可能是第三方的。比如有下面五个文件,生成一个静态库,一个动态库,一个执行文件...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 943,011
精华内容 377,204
关键字:

动态库怎么使用