精华内容
下载资源
问答
  • linux动态链接库

    2018-08-22 18:01:46
    动态链接库与普通的程序相比而言,没有main函数,是一系列函数的实现。通过shared和fPIC编译参数生产so动态链接库文件。程序在调用库函数时,只需要连接上这个库即可。例如下面实现一个简单的整数四则运输的动态链接...
  • Linux动态链接库

    2015-04-28 16:44:12
    原文地址:Linux动态链接库作者:liliang Linux动态链接库编程入门 动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如Win32内核就是3个DLL文件构成。这种技术在Linux...
    原文地址:Linux动态链接库作者:liliang
    Linux动态链接库编程入门
    动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如Win32内核就是3个DLL文件构成。这种技术在Linux操作系统下也有对应的实现,就是Linux标准对象Standard Ojbect,对应的文件扩展名为.so。

      下面通过一个简单的例子开始介绍Linux标准对象。
      我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下:

    #include <stdio.h>
    #include <stdlib.h>

    void show() {
      printf("Standard Object by gasheron");
    }

      保存为myso.c文件,按照如下编译:

    $ gcc -fPIC -shared -o libmyso.so myso.c

      执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。

      不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序:

    #include <stdio.h>

    int main() {
      printf("Invoke my son");
      show();
      return 0;
    }

      保存为invoke.c,按照如下gcc开关编译:

    $ gcc -o test invoke.c ./libmyso.so

      编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。

      如下测试结果:

    $ ./test
    Invoke my so
    Standard Object by gashero

      希望上文的例子可以对大家有所帮助。

    如何在 Linux 下调试动态链接库

    大家都知道在 Linux 可以用 gdb 来调试应用程序,当然前提是用 gcc 编译程序时要加上

    -g 参数。
    我这篇文章里将讨论一下用 gdb 来调试动态链接库的问题。


      首先,假设我们准备这样的一个动态链接库:

    QUOTE:
    库名称是: ggg
    动态链接库文件名是: libggg.so
    头文件是: get.h
    提供这样两个函数调用接口:
        int get ();
        int set (int a);

    要生成这样一个动态链接库,我们首先编写这样一个头文件:

    [Copy to clipboard]
    CODE:

    int get ();
    int set (int a);

    然后准备这样一个生成动态链接库的源文件:

    [Copy to clipboard]
    CODE:

    #include <stdio.h>

    #include "get.h"

     

    static int x=0;

    int get ()

    {

            printf ("get x=%dn", x);

            return x;

    }

    int set (int a)

    {

            printf ("set a=%dn", a);

            x = a;

            return x;

    }

    然后我们用 GNU 的 C/C++ 编译器来生成动态链接库,编译命令如下:

    QUOTE:
    g++ get.cpp -shared -g -DDEBUG -o libggg.so

    这样我们就准备好了动态链接库了,下面我们编写一个应用程序来调用此动态链接库,源代码如下:

    [Copy to clipboard]
    CODE:

    #include <stdio.h>

    #include "get.h"

    int main (int argc, char** argv)

    {

            int a = 100;

            int b = get ();

            int c = set (a);

            int d = get ();

     

            printf ("a=%d,b=%d,c=%d,d=%dn",a,b,c,d);

            return 0;

    }

    编译此程序用下列命令,如果已经把上面生成的 libggg.so 放到了库文件搜索路径指定的文件目录,比如 /lib 或 /usr/lib 之类的,就用下面这条命令:

    QUOTE:
    g++ pk.cpp -o app -Wall -g -lggg

    否则就用下面这条命令:

    QUOTE:
    g++ pk.cpp -o app -Wall -g -lggg -L`pwd`

    下面我们就开始调试上面命令生成的 app 程序吧。如果已经把上面生成的 libggg.so 放到了库文件搜索路径指定的文件目录,比如 /lib或 /usr/lib 之类的,调试就顺利完成,如下

    QUOTE:
    linux#gdb">zhoulifa@linux#gdb ./app
    GNU gdb 6.4-debian
    Copyright 2005 Free Software Foundation,Inc.
    GDB is free software, covered by the GNU

    General Public License, and you are
    welcome to change it and/or distribute

    copies of it under certain conditions.
    Type "show copying" to see theconditions.


    There is absolutely no warranty for GDB.

    Type "show warranty" for details.This GDB was configured as "i486-linux-

    gnu"...Using host libthread_db library"/lib/tls/i686/cmov/libthread_db.so.1".

    (gdb) b main   
    Breakpoint 1 at 0x804853c: file pk.cpp,line 7.
    (gdb) b set     
    Function "set" not defined.
    Make breakpoint pending on future shared

    library load? (y or [n]) y Breakpoint 2 (set) pending.
    (gdb) run
    Starting program: /data/example/c/app
    Breakpoint 3 at 0xb7f665f8: file get.cpp,line 11.
    Pending breakpoint "set" resolved

    Breakpoint 1, main (argc=1,argv=0xbf990504) at pk.cpp:7
    7               int a = 100;
    (gdb) n    
    8               int b = get ();
    (gdb) n     
    get x=0
    9               int c = set (a);(gdb) n

    Breakpoint 3, set (a=100) at get.cpp:11
    11              printf ("set a=%dn", a);

    (gdb) list  
    6               printf ("get x=%dn", x);
    7               return x;
    8       }
    9       int set (int a)
    10      {
    11              printf ("set a=%dn", a);
    12              x = a;
    13              return x;
    14      }
    (gdb) n
    set a=100
    12              x = a;(gdb) n
    13              return x;(gdb) n
    14      }
    (gdb) n
    main (argc=1, argv=0xbf990504) at

    pk.cpp:10
    10              int d = get ();
    (gdb) n
    get x=100
    11              printf ("a=%d,b=%d,c=%

    d,d=%dn",a,b,c,d);
    (gdb) n
    a=100,b=0,c=100,d=100
    12              return 0;
    (gdb) c
    Continuing.

    Program exited normally.
    (gdb) quit zhoulifa@linux#

    如果我们没有把动态链接库放到指定目录,比如/lib里面,调试就会失败,过程如下:

    QUOTE:
    zhoulifa@linux# gdb ./app
    GNU gdb 6.4-debian
    Copyright 2005 Free Software Foundation,

    Inc.
    GDB is free software, covered by the GNU

    General Public License, and you arewelcome to change it and/or distribute

    copies of it under certain conditions.


    Type "show copying" to see theconditions.
    There is absolutely no warranty for GDB.

    Type "show warranty" for details.
    This GDB was configured as "i486-linux-

    gnu"...Using host libthread_db library

    "/lib/tls/i686/cmov/libthread_db.so.1".

    (gdb) b main
    Breakpoint 1 at 0x804853c: file pk.cpp,

    line 7.
    (gdb) b set
    Function "set" not defined.
    Make breakpoint pending on future shared

    library load? (y or [n]) y
    Breakpoint 2 (set) pending.
    (gdb) run 
    Starting program: /data/example/c/app
    /data/example/c/app: error while loading

    shared libraries: libggg.so: cannot open

    shared object file: No such file or

    directory

    Program exited with code 0177.
    (gdb) quit
    zhoulifa@linux#

    本次实验的环境是:
    CPU:AMD Athlon(tm) 64 Processor 3000+
    内存:512M
    OS:Ubuntu GNU/Linux 6.06 dapper LTS
    gcc:gcc 版本 4.0.3 (Ubuntu 4.0.3-1ubuntu5)

    Linux下使用动态链接库

    使用动态链接库,我认为,再比较大的程序运行过程中,是一种很有优势的。所以就花了一天时间来学习一下。

    使用动态链接库,需要了解一下内容

    头文件:
     <dlfcn.h>
    函数:
    void *dlopen(const char *filename, int flag);
    const char *dlerror(void);
    void *dlsym(void *handle, char *symbol);
    int dlclose(void *handle);


    相关的信息可以通过 man dlopen查询

    在编译动生成态链接库的时候,
    需要参数 -shared

    在使用动态链接库的时候,
    需要参数 -ldl

    其他相关参数有
    -fpic -fPIC  -rdynamic

    如有库函数文件Lib.c, 主函数文件Main.c
    则有如下Makefile

    all: comple link

    comple:
        gcc -c Lib.c -o Lib.o
        gcc -c Main.c -o Main.o

    link:
        gcc -shared Lib.o -o Lib.so
        gcc -ldl Main.o -o Main


    另外,在C++中使用动态连接库的时候,请注意:
    必须用
    extern "C"
    {
    }
    将动态苦定义为C的编译连接方式

    否则由于C++命名方式于C不同,会造成生成的动态链接库不能使用(无法定位或函数)

    文章选取的例子非常简单,上手容易,只是为了讲述静态与动态链接库的生成和链接过
        程,还有他们之间的区别。以下例子在 gcc 4.1.1 下顺利通过。 


    文件预览 (补充)

    文件目录树如下,如你所见,非常简单。
    1. libtest/  
    2. |-- lt.c  
    3. |-- lt.h  
    4. `-- test.c  


    代码

    #lt.c
    1.   
    2.   
    3. #include <stdio.h>  
    4.   
    5. void myprint(void)  
    6. {  
    7.   printf("Linux library test!n");  
    8. }  


    # lt.h
    1.   
    2.   
    3. void myprint(void);  


    #test.c
    1.   
    2.   
    3. #include "lt.h"  
    4.   
    5. int main(void)  
    6. {  
    7.   myprint();  
    8.   return 0;  
    9. }  

    先看静态库

    首先做成静态库 liblt.a 。
    1. $ gcc -c lt.c -o lt.o  
    2. $ ar cqs liblt.a lt.o  



    再者,链接,这里指定了静态库的位置,注意文件顺序不可乱序。

    1. $ gcc test.o liblt.a -o test  


    这个时候再来看他的引用库情况。
    1. $ ldd test  
    2.         linux-gate.so.1 =>  (0xffffe000)  
    3.         libc.so.6 => /lib/libc.so.6 (0xb7e29000)  
    4.         /lib/ld-linux.so.2 (0xb7f6e000)  


    动态库

    做成动态库 liblt.so 。
    1. $ gcc -c lt.c -o lt.o  
    2. $ gcc -shared -Wall -fPIC lt.o -o liblt.so  


    链接方法I,拷贝到系统库里再链接,让gcc自己查找
    1. $ sudo cp liblt.so /usr/lib  
    2. $ gcc -o test test.o -llt  

    这里我们可以看到了 -llt 选项,-l[lib_name] 指定库名,他会主动搜索
    lib[lib_name].so 。这个搜索的路径可以通过 gcc --print-search-dirs来查找。

    链接方法II,手动指定库路径
    1. $ cc -o test test.o -llt -B /path/to/lib

    这里的-B 选项就添加 /path/to/lib 到gcc搜索的路径之中。这样链接没有问题但是方法II
    中手动链接好的程序在执行时候仍旧需要指定库路径(链接和执行是分开的)。需要添加系
    统变量 LD_LIBRARY_PATH :
    1. $ export LD_LIBRARY_PATH=/path/to/lib  


    这个时候再来检测一下test程序的库链接状况(方法I情况)
    1. $ ldd test  
    2.         linux-gate.so.1 =>  (0xffffe000)  
    3.         liblt.so => /usr/lib/liblt.so (0xb7f58000)  
    4.         libc.so.6 => /lib/libc.so.6 (0xb7e28000)  
    5.         /lib/ld-linux.so.2 (0xb7f6f000)  

    恩,是不是比静态链接的程序多了一个 liblt.so ?恩,这就是静态与动态的最大区别,静
    态情况下,他把库直接加载到程序里,而在动态链接的时候,他只是保留接口,将动态库与
    程序代码独立。这样就可以提高代码的可复用度,和降低程序的耦合度。

    参考:http://www-128.ibm.com/developerworks/cn/linux/sdk/dll/index.html
    http://www.oklinux.cn/html/developer/java/20070630/33743.html
    http://blog.csdn.net/wenxy1/archive/2005/12/15/553216.aspx

     

     原文地址 http://blog.csdn.net/yang_rong_yong/archive/2008/10/17/3090212.aspx
    展开全文
  • Linux 动态链接库

    2015-12-11 20:43:59
    Linux动态链接库的使用 1、前言  在实际开发过程中,各个模块之间会涉及到一些通用的功能,比如读写文件,查找、排序。为了减少代码的冗余,提高代码的质量,可以将这些通用的部分提取出来,做出公共的...

    Linux动态链接库的使用

    1、前言

      在实际开发过程中,各个模块之间会涉及到一些通用的功能,比如读写文件,查找、排序。为了减少代码的冗余,提高代码的质量,可以将这些通用的部分提取出来,做出公共的模块库。通过动态链接库可以实现多个模块之间共享公共的函数。之前看《程序员的自我修养》中讲到程序的链接和装入过程,这些玩意都是底层的,对于理解程序的编译过程有好处。http://www.ibm.com/developerworks/cn/linux/l-dynlink/博文介绍了程序的链接和装入过程。本文重点在于应用,如何编写和使用动态链接库,后续使用动态链接库实现一个插件程序。

    2、动态链接库生产

      动态链接库与普通的程序相比而言,没有main函数,是一系列函数的实现。通过shared和fPIC编译参数生产so动态链接库文件。程序在调用库函数时,只需要连接上这个库即可。例如下面实现一个简单的整数四则运输的动态链接库,定义的caculate.h和caculate.c两个文件,生产libcac.so动态链接库。

    程序代码如下:

    复制代码
    /*caculate.h*/
    
    #ifndef CACULATE_HEAD_
    #define CACULATE_HEAD_
    //加法
    int add(int a, int b);
    //减法
    int sub(int a, int b);
    //除法
    int div(int a, int b);
    //乘法
    int mul(int a, int b);
    
    #endif
    复制代码
    复制代码

    /*caculate.c文件*/
    #include "caculate.h" //求两个数的和 int add(int a, int b) { return (a + b); } //减法 int sub(int a, int b) { return (a - b); } //除法 int div(int a, int b) { return (int)(a / b); } //乘法 int mul(int a, int b) { return (a * b); }
    复制代码

    编译生产libcac.so文件如下: gcc -shared -fPIC caculate.c -o libcac.so
    编写一个测试程序调用此动态链接库的函数,程序如下所示:

    复制代码
    #include <stdio.h>
    #include "caculate.h"
    
    int main()
    {
        int a = 20;
        int b = 10;
        printf("%d + %d = %d\n", a, b, add(a, b));
        printf("%d - %d = %d\n", a, b, sub(a, b));
        printf("%d / %d = %d\n", a, b, div(a, b));
        printf("%d * %d = %d\n", a, b, mul(a, b));
        return 0;
    }
    复制代码

    编译生产可执行文件main如下:gcc main.c -o main -L ./ -lcac   (其中-L指明动态链接库的路径,-l后是链接库的名称,省略lib)
    程序执行结果如下所示:

     3、获取动态链接库的函数
      linux提供dlopen、dlsym、dlerror和dlcolose函数获取动态链接库的函数。通过这个四个函数可以实现一个插件程序,方便程序的扩展和维护。函数格式如下所示:

    复制代码
    #include <dlfcn.h>
    
    void *dlopen(const char *filename, int flag);
    
    char *dlerror(void);
    
    void *dlsym(void *handle, const char *symbol);
    
    int dlclose(void *handle);
    
     Link with -ldl.
    复制代码

    dlopen()是一个强大的库函数。该函数将打开一个新库,并把它装入内存。该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的。写个测试程序调用上面生产libcac.so库如下所示:

    复制代码
    #include <stdio.h>
    #include <dlfcn.h>
    
    #define DLL_FILE_NAME "libcac.so"
    
    int main()
    {
        void *handle;
        int (*func)(int, int);
        char *error;
        int a = 30;
        int b = 5;
    
        handle = dlopen(DLL_FILE_NAME, RTLD_NOW);
        if (handle == NULL)
        {
        fprintf(stderr, "Failed to open libaray %s error:%s\n", DLL_FILE_NAME, dlerror());
        return -1;
        }
    
        func = dlsym(handle, "add");
        printf("%d + %d = %d\n", a, b, func(a, b));
    
        func = dlsym(handle, "sub");
        printf("%d + %d = %d\n", a, b, func(a, b));
    
        func = dlsym(handle, "div");
        printf("%d + %d = %d\n", a, b, func(a, b));
        
        func = dlsym(handle, "mul");
        printf("%d + %d = %d\n", a, b, func(a, b));
    
        dlclose(handle);
        return 0;
    }
    复制代码

    程序执行结果如下所示:gcc call_main.c -o call_main -ldl

    展开全文
  • linux 动态链接库

    2017-07-14 16:45:24
    ldconfig is a program to maintain the shared library cache. Updates the necessary links. the cache is stored in /etc/ld.so.cache be default, the shared library files in /usr/lib when a new lib ...

    ldconfig is a program to maintain the shared library cache. Updates the necessary links.

    • the cache is stored in /etc/ld.so.cache
    • be default, the shared library files in /usr/lib

    • when a new lib installed not in /usr/lib, an error may occur: error while loading shared libraries xxx.so. Cannot open shared object fileL No such file or directory
      哈哈 可能有更好的解决办法,我的办法是

    sudo cp /mydir/libopenblas.so /usr/lib/libopenblas.so && ldconfig

    ldd : Tells what libraries a given program needs to run. ldd test

    symbolic link

    • also called `soft link’, like a shortcut in Windows

    • to create a symbolic link in Unix, ln -s src_file my_shortcut

    展开全文
  • 主要介绍了linux动态链接库使用方法,大家参考使用吧
  • linux动态链接库示例

    2011-09-18 13:58:06
    linux动态链接库的制作,linux下制作动态链接库 C语言描述
  • 介绍了LINUX动态链接库的基本知识.其要点是:用户根据实际情况需要,利用dlopen,dlsym,dlclose等动态链接库操作函 数,装入指定的动态链接库中指定的函数,然后加以执行.
  • Linux动态链接库的使用

    动态链接库的使用

    定义add.h和add.c两个文件

    add.h

    #ifndef ADD_H_
    #define ADD_H_
    
    int add(int,int);
    
    #endif

    add.c

    #include "add.h"
    
    int add(int a,int b)
    {
           return (a+b);
    }

    编译生成so文件

    gcc -shared -fPIC add.c -o libadd.so

    编写测试程序

    #include <stdio.h>
    #include "add.h"
    
    int main(void)
    {
           printf("1+1=%d\n",add(1,1));
    }

    库文件一般放在/usr/lib中。默认情况下,在链接动态链接库的时候会在这个文件夹下寻找。

    (/usr/include放的是头文件,可以把add.h放在这里或者程序存放的位置)

    把libadd.so复制到/usr/lib中

    sudo cp libadd.so /usr/lib/libadd.so

    编译测试程序

    gcc demo.c -o demo -ladd   //-l后面是省略lib的链接库的名字
    展开全文
  • 德卡读卡器linux动态链接库头文件(x86)
  • linux动态链接库的开发实例,简述了一段linux的开发 必备技能!
  • 本文源于学习linux下通过cmake和Makefile两种方式生成动态链接库.so文件及对.so文件使用的记录: linux 动态链接库创建及使用参考博文:linux下生成动态链接库并使用(使用cmake) 通过自己编写Makefile文件来...
  • 在《LINUX下动态链接库的创建与应用》一文中,我介绍了LINUX动态链接库的 基本知识.其要点是:用户根据实际情况需要,利用dlopen,dlsym,dlclose等动 态链接库操作函数,装入指定的动态链接库中指定的函数,然后加以执行...
  • Linux动态链接库搜索路径

    千次阅读 2013-07-26 17:32:11
    Linux动态链接库搜索路径 2011-06-30 11:43:59 分类: LINUX  编译程序时如果程序依赖的动态链接库没有安装在系统标准路径:/lib/或/usr/lib程序运行时往往提示找不到相应的动态链接库文件无法执行,原因...
  • Linux动态链接库 so文件的创建与使用

    千次阅读 2019-02-17 13:45:02
    Linux动态链接库 so文件的创建与使用
  • LINUX 动态链接库高级应用

    千次阅读 2012-09-06 07:53:24
    LINUX 动态链接库高级应用 在《LINUX动态链接库的创建与应用》一文中,我介绍了LINUX 动态链接库的基本知识.其要点是: 用户根据实际情况需要,利用dlopen,dlsym,dlclose等动态链接库操作函数,装入指定的动态链接...
  • Linux动态链接库的使用 1、前言  在实际开发过程中,各个模块之间会涉及到一些通用的功能,比如读写文件,查找、排序。为了减少代码的冗余,提高代码的质量,可以将这些通用的部分提取出来,做出公共的...
  • 3、两种系统动态库比较分析Windows和Linux采用动态链接库技术目的是基本一致的,但由于操作系统的不同,他们在许多方面还是不尽相同,下面从以下几个方面进行阐述。(1)动态库程序编写,在Windows系统下的执行文件...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,649
精华内容 3,059
关键字:

linux动态链接库

linux 订阅