精华内容
下载资源
问答
  • 库的存在极大的提高了C/C++程序的复用性,但是库对于初学者来说有些难以驾驭,本文从Linux的角度浅谈Linux下的静态库、动态库和动态加载库。  Linux库类型  Linux下可以创建两种类型的库:  1、静态库(.a): 在...
  • c# 实现动态加载c++ dll 动态库 本示例提供动态加载 卸载c++ dll动态库 所用工具 : visual studio ; 系统:Windows
  • QT动态库实现及调用方式,源码工程和库文件,简单的实现方便了解QT动态库的嗲用方式
  • 以C语言为例子,Linux下CMake生成和实用动态库基本工程。 本资源主要为了方便自己日后下载,内容在博客里都有:https://blog.csdn.net/a435262767/article/details/91379359
  • 主要介绍了Linux下动态链接库加载路径及搜索路径问题,需要的朋友可以参考下
  • 该文档内记录了java调用动态库的详细过程,用jna,调用
  • 主要介绍了linux生成(加载动态库静态库示例方法,大家参考使用
  • 围绕系统动态库加载原语的安全绑定。 该库最重要的安全保证是防止在卸载Library后可能发生的悬挂Symbol 。 使用此库允许加载动态库(也称为共享库)以及使用这些库包含的函数和静态变量。 libloading可以在ISC...
  • 动态库:在运行时加载 3.生成可执行文件存在的区别(优缺点) (1)使用静态库生成的可执行文件大于动态库生成的可执行文件(程序占用的内存较多) (2)使用静态库生成的可执行文件难以升级,使用动态库生成的可...
  • 利用VC++实现动态链接库动态加载的方式。文件中包含DLL文件的编写以及加载测试程序,需要的可以下载参考。内容简单,阅读性强!
  • java获取dll动态库源码分享。通过jna加载动态库,然后初始化动态库,打开动态库,在通过指针获取动态库里面的数据。
  • Linux qtcreator动态加载动态链接案例
  • C/C++动态库加载

    千次阅读 2019-07-11 15:44:37
    C/C++动态库加载动态库动态库加载方式链接加载动态加载dlopendlsymdlclosedlerrorextern 'C'参考end 动态库 动态库又称动态链接库英文为DLL,是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序同时使用...

    动态库

    动态库又称动态链接库英文为DLL,是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和资源。多个应用程序可同时访问内存中单个DLL 副本的内容。DLL 是一个包含可由多个程序同时使用的代码和数据的库。Windows下动态库为.dll后缀,在linux下为.so后缀,下文以linux为例进行说明。

    动态库加载方式

    链接加载

    在程序运行时将链接的动态库装载入进程实体(内存中)。应用程序需要包含动态库对应的头文件来调用动态库的方法,并链接动态库提供方法支持。

    动态加载

    使用dlopendlsymdlclosedlerror来动态地将动态库装载到当前进程实体中,头文件#include <dlfcn.h>

    dlopen

    将指定的动态库以特定的方式装载到当前进程实体,并返回一个可操作的句柄,用以后续获取函数地址等操作。

    void *dlopen(const char *filename, int flag);
    

    The function dlopen() loads the dynamic library file named by the null-terminated string filename and returns an opaque “handle” for the dynamic library.

    dlsym

    从指定的(由dlopen的返回值指定)库中获得指定的函数(即函数,第二个参数为函数名)。

    void *dlsym(void *handle, const char *symbol);
    

    The function dlsym() takes a “handle” of a dynamic library returned by dlopen() and the null-terminated symbol name, returning the address where that symbol is loaded into memory.

    dlclose

    可将关闭卸载动态库。注意,实际是减掉一个对动态库的引用(ref),仅当减到0时才会触发卸载动态库的操作。

    int dlclose(void *handle);
    

    The function dlclose() decrements the reference count on the dynamic library handle handle. If the reference count drops to zero and no other loaded libraries use symbols in it, then the dynamic library is unloaded.

    dlerror

    返回一个字符串用以描述错误。

    char *dlerror(void);
    

    The function dlerror() returns a human readable string describing the most recent error that occurred from dlopen(), dlsym() or dlclose() since the last call to dlerror().

    extern ‘C’

    参考

    C/C++:使用dlopen、dlsym、dlclose运行时装载动态库)

    end

    入门快速上手贴,有问题的地方请指正。

    展开全文
  • java程序中加载动态链接文件方法,涉及到C语言实现控制底层硬件的方法
  • Linux下不能加载动态库问题 当出现下边异常情况 ./test: error while loading shared libraries: libmfs_open.so: cannot open shared object file: No such file or directory 若动态库的路径在(/usr/cluster/....
  • 软件库Library之静态库\动态库和静态加载\动态加载 动态库之导入库 https://blog.csdn.net/wallaceli1981/article/details/5740718 * 动态库在开发时仅是把dll中的函数名和参数放到应用程序中,应用程序运行...

    软件库Library之静态库\动态库和静态加载\动态加载

     

    动态库之导入库

    https://blog.csdn.net/wallaceli1981/article/details/5740718

    * 动态库在开发时仅是把dll中的函数名和参数放到应用程序中,应用程序运行时根据函数名和参数调用dll中的函数来运行,这样操作系统中的应用程序可以同时使用同一个dll。可以有效地节省硬盘空间,当然这样做使得程序设计更有层次。也有利于软件工程师的分工和信息安全

    * 动态库以.dl文件形式存在,且一般都有一个对应的引入库以.lib文件形式存在。纯资源dll不生成.lib引入库。

       >引入库和静态库的扩展名均为*.lib,但是引入库仅包含一些函数名和参数信息,没有函数体,是为调用动态库服务的,它和动态库的关系相当于.h文件和.cpp文件之间的关系;

    * 动态库两种绑定方式

       >静态绑定(static blnding) 使用静态绑定的程序在一开始载入内存的时候,载入程序就会把程序所有调用到的动态代码的地址算出、确定下来。这种方式使程序刚运行时的初始化时间较长,不过一但完成动态装载,程序的运行速度就很快。

       >动态绑定(dynamic binding)   使用这种方式的程序并不在一开始就完成动态链接,而是直到真正调用动态库代码时,载入程序才计算(被调用的那部分)动态代码的逻辑地址,然后等到某个时候,程序又需要调用另外某块动态代码时,载入程序才又去计算这部分代码的逻辑地址。所以,这种方式侄程序初始化时间较短,但运行期间的性能比不上静态绑定的程序。

     2. 在项目中使用动态库的方法:

            方法一:  隐式加载: 这种方式和静态库的使用方法一样,对应有3种具体的方法,注意此时要包含的是导入库而不是动态库,依然需要头文件,代码中可直接使用头文件中的函数名,并且这种方式在运行时需要需要动态库。

            方法二:  显式加载(又称运行时动态链接):在代码中使用LoadLibrary()显式打开dll文件,使用GetProcAddress获取函数地址然后使用,使用完之后用FreeLibrary显式释放dll文件。这种方式不需要导入库及.h文件。

            使用隐式加载时,如果进程在启动时未找到dll,则操作系统将终止此进程。但使用显式加载时则进程不会被终止。

    --------------------- 

     

    Linux下动态库两种调用加载方式总结

    https://blog.csdn.net/shaosunrise/article/details/81161064

    方式1使用头文件,所以可以直接调用头文件声明的函数。编译的时候指定了动态库位置和名称,程序启动时候系统就会自动加载相应位置的so动态库。 
    方式2没有头文件,编译的时候也不需要指定动态库信息。但是需要在程序中使用dlopen函数加载相应位置的so动态库,且要使用dlsym函数根据函数符号去查找此函数的地址。

    Windows下动态库的动态加载和静态加载

    https://blog.csdn.net/wallaceli1981/article/details/5740718

    使用动态库的两种方法(windows)

      >方法一: load-time dynamic linking 
    在要调用dll的应用程序链接时,将dll的输入库文件(import library,.lib文件)包含进去。具体的做 法是在源文件开头加一句#include ,然后就可以在源文件中调用dlldemo.dll中的输出文件了。

      >方法二: run-time dynamic linking 
    不必在链接时包含输入库文件,而是在源程序中使用LoadLibrary或LoadLibraryEx动态的载入dll。
    --------------------- 

    https://blog.csdn.net/CNHK1225/article/details/51952662

    动态库的动态加载方式调用,里面定义的数据结构理论上只作为dll内部使用!在这种情况下,如果这个dll的导出函数参数有内部定义的数据类型,显然是违反低耦合性原则的,实际上这种情况下编写dll方应该提供.h、.lib和.dll文件给使用者的,即你不能以动态库的动态加载方式调用,而是以动态库的静态加载方式调用!
      换句话说,一般的只提供dll和导出函数文档这种情况,其dll中的导出函数参数列表都应该是基础数据类型,而不应带有内部的自定义结构,当然,带内部定义数据机构参数的函数,也应该是内部函数,不做导出用。

    要想使用dll里定义的数据结构,必须要有头文件的,或者你自己定义一个同名的数据结构,但是这种情况下你得知道那个数据结构的组成

    总之,对于dll的编写者和使用者,双方必须要有明确的需求,以何种方式使用,决定着dll的编写规则,也决定着使用规则.....

    --------------------- 

    linux动态库与静态库混合连接

    https://www.cnblogs.com/bigben0123/p/3304863.html

    1, 在应用程序需要连接外部库的情况下,linux默认对库的连接是使用动态库,在找不到动态库的情况下再选择静态库。使用方式为:

    gcc test.cpp -L. -ltestlib

    如果当前目录有两个库libtestlib.so libtestlib.a 则肯定是连接libtestlib.so。如果要指定为连接静态库则使用:

    gcc test.cpp -L. -static -ltestlib

    使用静态库进行连接。

     

    2, 当对动态库与静态库混合连接的时候,使用-static会导致所有的库都使用静态连接的方式。这时需要作用-Wl的方式:

    gcc test.cpp -L. -Wl,-Bstatic -ltestlib  -Wl,-Bdynamic -ltestlib 

    3, 另外还要注意系统的运行库使用动态连接的方式,所以当动态库在静态库前面连接时,必须在命令行最后使用动态连接的命令才能正常连接

    ,如:

    gcc test.cpp -L. -Wl,-Bdynamic -ltestlib -Wl,-Bstatic -ltestlib  -Wl,-Bdynamic 

     


     

    1、使用GCC创建和使用静态库 

    (1)gcc –o mylib.o –c mylib.c  //生成o文件
    (2)ar -rcs libmylib.a mylib.o   //生成a文件
        -c create的意思
        -r replace的意思,表示当插入的模块名已经在库中存在,则替换同名的模块。
    (3)cp libmylib.a /usr/lib/       //拷贝到默认目录
    (4)编写程序使用库中的函数,需要包含相关的头文件,即可用下面的方式进行编译连接。
        gcc –o test test.c -L. -lmylib
        -L指定静态函数库的位置供查找,注意L后面还有'.',表示静态函数库在本目录下查找。
        -l则指定了静态函数库名,由于静态函数库的命名方式是lib***.a,其中的lib和.a忽略。

    2、使用GCC创建和使用动态库

    (1)gcc –fPIC –o mylib.o –c mylib.c
        gcc –shared –o libtt.so mylib.o
        -fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。
        -shared 作用于链接阶段,实际传递给链接器ld,让其添加作为共享库所需要的额外描述信息,去除共享库所不需的信息。
    (2)也可以直接使用下面一条命令:
        gcc –fPIC –shared –o libtt.so mylib.c
    (3)将动态库拷贝到linux 的标准库中,usr/local/lib 或者/usr/lib 或者/lib,使用ldconfig命令加载
        cp libttt.so /usr/local/lib
    (4) 编译src 程序使用动态库,隐式调用方法: 在编译调用库函数代码时指明动态库的位置及名字
        gcc –o test test.c  ./usr/lib/libttt.so
    (5)编译src程序使用动态库,显示调用方法
         显式调用动态库需要四个函数的支持, 函数 dlopen 打开动态库, 函数 dlsym 获取动态库中对象基址, 函数 dlerror 获取显式动态库操作中的错误信息, 函数 doclose 关闭动态库.

    #include <dlfcn.h> 
    int main() 

                    void *pHandle; 
                    void (*pFunc)(); // 指向函数的指针 
                    int *p; 
                    pHandle = dlopen("./d1.so", RTLD_NOW); // 打开动态库 
                    if(!pHandle){ 
                                    printf("Can't find d1.so \n"); 
                                    exit(1); 
                    } 
                    pFunc = (void (*)())dlsym(pHandle, "print"); // 获取库函数 print 的地址 
                    if(pFunc) 
                                    pFunc(); 
                    else 
                                    printf("Can't find function print\n"); 
                    dlclose(pHandle); // 关闭动态库 
                    return 0; 

        gcc –o test test.c -lttt -L
        此时会到系统目录下去搜素libttt.so文件,具体搜索方法见下一节。

    3、shell 搜索动态库路径位置的两种方法
        (1) 使用命令导入动态库的路径,命令如下:
        export LD_LIBRARY_PATH=dir (如/usr/local/lib)
        (2) 在/etc/ld.so.conf 文件中更增加一条,修改后用ldconfig 命令载入修改。

    4、其他

    (1)ldd命令可以查看一个可执行程序依赖的共享库,
        # ldd /bin/ln
        => /lib/libc.so.6 (0×40021000)/lib/ld-linux.so.2
        => /lib/ld- linux.so.2 (0×40000000)
        可以看到ln命令依赖于libc库和ld-linux库

    (2)看动态库包含哪些定义用:
         nm -D lib*.so

     (3)当生成动态库时,源文件又引用其他静态库,需要一起写。这时源文件里面不用用extern f();,这样就不能引入静态库。需要直接#include 头文件。

         比如,gcc -fexceptions -O2 -o hello.node ./build/Release/obj.target/hello/hello.o ./libpanda.a /usr/local/lib/libnfc.a -shared -fPIC

     

    参考:

    gcc生成静态库和动态库: http://blog.csdn.net/ast_224/article/details/3988244

    动态库(.so)链接静态库(.a)的情况总结

     http://www.cnblogs.com/nobugtodebug/archive/2012/11/07/e6cd72c67b3dd843f40d7ce919f7336a.html

    http://www.cppblog.com/deane/archive/2014/05/23/165216.html

     

     

    展开全文
  • linux加载动态库问题

    千次阅读 2018-09-10 16:12:03
    当我们在linux系统引用动态库时,经常会遇到一个问题,加入我们需要的动态库没有在系统的默认目录下,我们编译时使用-L指定了动态库的路径,编译时没有问题,但是执行调用该动态库的可执行文件时,却提示找不到动态...

           当我们在linux系统引用动态库时,经常会遇到一个问题,加入我们需要的动态库没有在系统的默认目录下,我们编译时使用-L指定了动态库的路径,编译时没有问题,但是执行调用该动态库的可执行文件时,却提示找不到动态库。下面我将以一个简单的例子来,复现这个问题和解决这个问题的办法。

            假设我们使用tensorflow,把需要调用的libtensorflow.so和libtensorflow_framework.so两个动态库放在我们和我们的程序同一级目录下。

            测试程序如下:

    #include <stdio.h>
    #include "c_api.h"

    int main(void)

    {
      printf(“Hello from TensorFlow C library version %s\n”, TF_Version());
      return 0;
    }

    程序编译及结果如下:

    可见程序编译没有问题,但是当执行可执行程序时,出现如下结果:

     

    程序提示加载动态库失败,使用ldd命令查看一下:

     

    为什么我们编译的时候明明指定了动态库的路径,而且程序编译的时候没有问题,执行的时候却找不到了呢? 

    1、因为我们在编译的时候使用-L指定动态库的路径,只是告诉编译器我们所需要的动态库在某个目录下,只对编译起作用 

    2、当程序执行时,程序还是回去系统的默认路径下寻找程序运行所需的动态库

    所以在程序运行的时候会出现找不到动态库的问题。

    解决办法,使用-Wl,-rpath 所需动态库的路径 告诉程序如果在默认路径下找不到所需动态库,则去当前指定的路径下找动态库。修改gcc编译指令后,结果如下:

        可见,动态库加载成功,程序运行成功,问题解决。

     

    展开全文
  • 包含依赖包 该框架支持linux和windows动态库加载,方便简单,用户只需要定义自己的接口即可。关于jna的文章在我的博客jna使用系列https://blog.csdn.net/Fanpei_moukoy/article/details/90455194
  • 博客地址:http://write.blog.csdn.net/postedit/42341407,有问题欢迎留言,谢谢!
  • 内存加载dll动态库

    2019-01-07 18:34:26
    动态链接库的加载方式主要要动态加载、静态加载两种,本案例为不使用现有api接口直接二进制形式加载动态库
  • 1.动态库和静态库的原理 GCC进行链接时,会把静态库中的...2.动态库加载失败的原因 下面通过ldd命令查看main的动态库依赖关系: 可以看到列出了用到的4个动态库。 上面提到的动态载入器eld-linux.so即最后一...

    目录

    1.动态库和静态库的原理

    2.动态库加载失败的原因

    3.解决方法

    3.1 DT_RPATH段

    3.2将libcalc.so的路径加入到环境变量LD_LIBRARY_PATH中

    3.3将libcalc.so的路径加入到/etc/ld.so.cache文件列表中

    3.4将libcalc.so直接放到/lib/、/usr/lib目录中


    1.动态库和静态库的原理

    GCC进行链接时,会把静态库中的代码放到可执行程序中。但是对于动态库,不会把代码放到可执行程序中,只会把一些相关信息(如动态库的名字等)放到可执行程序中。运行的时候,如果用到了动态库中的内容,在可执行程序中是找不到的。导致错误出现。

    注:执行时如果用到了动态库中的API,动态库会被加载到内存中。


    2.动态库加载失败的原因

    下面通过ldd命令查看main的动态库依赖关系:

    可以看到列出了用到的4个动态库。

    上面提到的动态载入器eld-linux.so即最后一个动态库。

    因为动态载入器在DT_RPATH段、环境变量LD_LIBRARY_PATH等中找不到libcalc.so的绝对路径,所以会报错。


    3.解决方法

    将libcalc.so的路径加入到DT_RPATH段、LD_LIBRARY_PATH、/etc/ld.so.cache文件列表或者将libcalc.so直接放到/lib/、/usr/lib目录中

    3.1 DT_RPATH段

    DT_RPATH段我们改变不了,直接下一个。

    3.2将libcalc.so的路径加入到环境变量LD_LIBRARY_PATH中

    方式1:在终端直接加 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/wcj/projec/lesson4/library/lib

    即先获取原来的环境变量,再在后面加上动态库的路径

    但是该终端关闭后,值之前加的环境变量就失效了,打开新终端之后又得重新弄。

    下面讲永久配置,分为两种方式:用户级别的配置和系统级别的配置


    方式2:永久配置---用户级别

    打开.bashrc文件:

    (vi中,shift+G可以跳到最后一行,小写的o可以向下插入一行)

    在最后一行插入:

    保存之后,使修改生效:

    第一个点相当于source,也可以写成“source .bashrc”

    回到原来的目录,发现可以运行:


    方式3:永久配置--系统级别

    配置之前,先把上面配置的删掉。并重新打开一个终端,防止上一步潜在的影响。

    打开/etc/profile文件:

    在最后一行添加:

    使修改生效:

    回到原来的目录中,可以执行,如下图:


    3.3将libcalc.so的路径加入到/etc/ld.so.cache文件列表中

    先将上面的修改删除,再重新打开一个终端

    先尝试打开/etc/ld.so.cache:

    发现不能编辑,如下图:

    既然不能直接修改这个文件,那就间接修改:

    添加动态库的路径:

    保存之后,更新:

    回到原来的目录,可以执行,如下图:


    3.4将libcalc.so直接放到/lib/、/usr/lib目录中

    最后一种不建议使用。因为这两个目录中保存的是系统的库文件,防止对其误操作。


    参考:牛客网 C++高薪求职项目《Linux高并发服务器开发》1.7/1.8动态库加载失败的原因和解决

    专属优惠链接:

    https://www.nowcoder.com/courses/cover/live/504?coupon=AvTPnSG

    展开全文
  • MFC模式下加载静态和动态链接库,压缩包中有详细的说明文档,并有加载静态库和动态库的代码实例,大家可以作为参考
  • 使用ide是vs, 使用Windows.h下的3个函数对动态库进行加载 第一个:HMODULE LoadLibrary(LibFileName : PChar)//获取dll句柄 参数是需要加载dll的路径,返回值dll句柄 第二个:FARPROC GetProcAddress(HMODULE ...
  • 什么时候采用共享动态加载方式呢?比如需要通过程序判断A条件下,加载A共享,B条件下加载B共享,或者条件未达到的情况下加载默认。这种需求,可以不通过gcc编译器,而通过代码来实现动态加载。 C动态加载...
  • 启动优化之动态库延迟加载

    千次阅读 2018-09-26 19:12:08
     动态库加载包括静态加载和动态加载, 静态加载就是使用lib,代码生成过程中链接用的。静态加载可以使用动态库中的导出函数和导出类,但是静态加载是程序启动时加载动态库,会占用启动时间。动态加载用LoadLibrary函...
  • c++ 的类中方法定位是编译时就完成的,而不是在run-time时去定位,所以动态加载时无法直接通过类名::函数名的方式调用到类中的方法。 但是这里有一种使用非常广泛的方式。 可以对要导出的类添加一个接口类,做成...
  • Windows/Linux链接器加载动态库的搜索路径顺序
  • 一、静态库 与汇编生成的目标文件一起链接为可执行文件。一个静态库可以简单看成是一组目标文件(.o/.obj...二、动态库 在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入。不同的应用程序如果调用...
  • Jni中执行ndk-build,编译第三方静态库(.a)和动态库(.so)的Android.mk文件写法,这是Jni测试引用第三方静态库和动态库demo
  • 很实用的例子,叫你如何在linux环境下编程时加载动态库

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 570,773
精华内容 228,309
关键字:

动态库什么时候动态加载