精华内容
下载资源
问答
  • Linux下共享库

    2010-11-22 12:11:00
    Linux系统共享库:/etc/ld.so.conf 共享库的搜索位置如:#cat /etc/ld.so.conf/usr/kerberos/lib/usr/X11R6/lib/usr/lib/sane/usr/lib/qt-3.1/libldconfig 共享库管理工具,在更新了共享库后运行该命令ldd ...

    Linux系统下,共享库:

     

    共享库:引用库中相应二进制代码的入口位置,从而间接引用
    在Linux中,以lib***.so.xx 为格式

     

    /etc/ld.so.conf            共享库的搜索位置
    如:
    #cat /etc/ld.so.conf
    /usr/kerberos/lib
    /usr/X11R6/lib
    /usr/lib/sane
    /usr/lib/qt-3.1/lib

    ldconfig                      共享库管理工具,在更新了共享库后运行该命令
    ldd                             查看可执行文件所用的共享库

    使用共享库示例:
    如:
    libhello.c  libhello.h  usrhello.c            //共享库源文件、共享库头文件、应用程序

    #cat libhello.c                               //查看库源文件内容
    #include <stdio.h>
     
    void print_hello(void)
    {
     printf("hello world,this is library!/n");
    }

    #cat libhello.h                               //查看库头文件内容
    #ifndef __libhello_H__
    #define __libhello_H__
     
    void print_hello(void);
     
    #endif /*__libhello_H__*/

    #cat usrhello.c                             //查看应用程序
    #include "libhello.h"
     
    int main()
    {
     print_hello();
     return 0;
    }

    //开始生成共享库
    #gcc -fPIC  -Wall -g -c libhello.c         //生成目标文件libhello.o
    -fPIC        生成与位置无关代码
    -g            生成调试信息
    -c             编译成.o 文件

    #gcc -g -shared -W1,-soname,libhello.so.0 -o libhello.so.0.0 libhello.o -lc                //生成共享库
    -shared     创建共享库
    -W1          为将后面的“soname,libhello.so.0”传递给共享库
    -soname,libhello.so.0          说明soname为libhello.so.0,其目标名为libhello.0.0
    -lc             引用C库

    #ln -sf libhello.so.0.0  libhello.so.0
    前面定义库名为libhello.so.0,因此需要创建一个libhello.so.0到libhello.so.0.0的连接

    #ln -sf libhello.so.0     libhello.so
    为了在连接用户的程序时使用lhello,需要再进行连接

    #gcc -Wall -g -c usrhello.c              生成目标文件usrhello.o
    -Wall               去除所有警告

    #gcc -g -o usrhello_shared usrhello.o -L ./ -lhello      //连接库

    #ldd usrhello_shared
    libhello.so => not found                          //在默认搜索路径中没有找到此库

    #LD_LIBRARY_PATH=$(pwd)  ./usrhello_shared        //指明库的路径
    hello,world,library!

     

    使用静态库,可以直接编译到执行文件中,因此文件执行不需要查找该库的路径
    使用共享库,运行时需要相应库的支持

    Linux系统首先会在“LD_LIBRARY_PATH”变量下查找库文件
    然后到/etc/ld.so.conf文件里所给的路径查找

    Linux会在路径/lib    /usr/lib下的库文件中搜索,下面是将创建自己的库文件添加到搜索路径的方法:
    1、创建共享库,保存在一个文件夹下
    2、如果希望在连接时不使用-L标识,就把库文件拷贝到/lib  /usr/lib下,
    把保存路径填写到文件/etc/ld.so.conf里
    3、执行命令#ldconfig,更新库信息

     

    展开全文
  • linux下共享库

    2012-01-07 23:47:53
    // 静态 gcc -c hello.c  ar crv libmyhello.a hello.o gcc main.c libmyhello.a -o main // 动态 gcc -c hello.c  gcc -shared -fPCI -o libmyhello.so hello.o gcc -o hello main.c -L. -...
    // 静态库
    gcc -c hello
    .c    
    ar crv libmyhello
    .a hello.o
    gcc main
    .c libmyhello.a -o main

    // 动态库
    gcc -c hello
    .c    
    gcc -shared -fPCI -o libmyhello
    .so hello.o
    gcc -o hello main
    .c -L. -lmyhello

    最主要的是GCC命令行的一个选项:
    -shared 该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件
    -fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。
    -L
    .:表示要连接的库在当前目录中
    -ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上
    .so来确定库的名称
    LD_LIBRARY_PATH:这个环境变量指示动态连接器可以装载动态库的路径。
    当然如果有root权限的话,可以修改
    /etc/ld.so.conf文件,然后调用 /sbin/ldconfig来达到同样的目的,不过如果没有root权限,那么只能采用输出LD_LIBRARY_PATH的方法了。
    展开全文
  • Linux下共享库(SO)有关的几个环境变量
                   

     Linux支持共享库已经有悠久的历史了,不再是什么新概念了。大家都知道如何编译、连接以及动态加载(dlopen/dlsym/dlclose) 共享库。但是,可能很多人,甚至包括一些高手,对共享库相关的一些环境变量认识模糊。当然,不知道这些环境变量,也可以用共享库,但是,若知道它们,可能就会用得更好。下面介绍一些常用的环境变量,希望对家有所帮助:

     

    LD_LIBRARY_PATH 这个环境变量是大家最为熟悉的,它告诉loader:在哪些目录中可以找到共享库。可以设置多个搜索目录,这些目录之间用冒号分隔开。在linux下,还提供了另外一种方式来完成同样的功能,你可以把这些目录加到/etc/ld.so.conf中,或则在/etc/ld.so.conf.d里创建一个文件,把目录加到这个文件里。当然,这是系统范围内全局有效的,而环境变量只对当前shell有效。按照惯例,除非你用上述方式指明,loader是不会在当前目录下去找共享库的,正如shell不会在当前目前找可执行文件一样。

     

    LD_PRELOAD 这个环境变量对于程序员来说,也是特别有用的。它告诉loader:在解析函数地址时,优先使用LD_PRELOAD里指定的共享库中的函数。这为调试提供了方便,比如,对于C/C++程序来说,内存错误最难解决了。常见的做法就是重载malloc系列函数,但那样做要求重新编译程序,比较麻烦。使用LD_PRELOAD机制,就不用重新编译了,把包装函数库编译成共享库,并在LD_PRELOAD加入该共享库的名称,这些包装函数就会自动被调用了。在linux下,还提供了另外一种方式来完成同样的功能,你可以把要优先加载的共享库的文件名写在/etc/ld.so.preload里。当然,这是系统范围内全局有效的,而环境变量只对当前shell有效。

     

    LD_ DEBUG 这个环境变量比较好玩,有时使用它,可以帮助你查找出一些共享库的疑难杂症(比如同名函数引起的问题)。同时,利用它,你也可以学到一些共享库加载过程的知识。它的参数如下:

      libs        display library search paths

      reloc       display relocation processing

      files       display progress for input file

      symbols     display symbol table processing

      bindings    display information about symbol binding

      versions    display version dependencies

      all         all previous options combined

      statistics  display relocation statistics

      unused      determined unused DSOs

      help        display this help message and exit

    BIND_NOW 这个环境变量与dlopen中的flag的意义是一致,只是dlopen中的flag适用于显示加载的情况,而BIND_NOW/BIND_NOT适用于隐式加载。

     

    LD_PROFILE/LD_PROFILE_OUTPUT:为指定的共享库产生profile数据,LD_PROFILE指定共享库的名称,LD_PROFILE_OUTPUT指定输出profile文件的位置,是一个目录,且必须存在,默认的目录为/var/tmp//var/profile。通过profile数据,你可以得到一些该共享库中函数的使用统计信息。

     

     

     

               

    再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

    展开全文
  • 共享库与静态库的区别在于,共享库只是在调用模块中嵌入调用代码的在库的相对位置的地址,当执行程序时,共享库会和程序一起加载到内存中...共享库以.so结尾,Linux下需要以lib开头 下面将以libmath.so来说明如何创...

    共享库与静态库的区别在于,共享库只是在调用模块中嵌入调用代码的在库的相对位置的地址,当执行程序时,共享库会和程序一起加载到内存中,当执行到调用共享库中代码的指令时跳转到共享库中执行,执行完毕后在跳转回来。
    相比于静态库占用空间小,方便更新(共享库发生变化后,程序不需要再次编译),但相比于静态库执行效率略低。
    共享库以.so结尾,Linux下需要以lib开头
    下面将以libmath.so来说明如何创建和使用共享库。

    1、创建共享库

    编译出位置无关目标文件(也就是在编译时加上-fpic):
    	gcc -c -fpic x1.c x2.c-> x1.o x2.o
    链接生成共享库:
    	gcc -shared x1.o x2.o -o libmath.so
    

    2、调用共享库

    可以直接调用共享库:需要调用者要和共享库库在同一路径下
    	gcc main.c libmath.so
    设置环境变量:
    	1.打开 vim ~/.bashrc 文件
       	2.在文件末尾添加一行
        		export LIBRARY_PATH=$LIBRARY_PATH:库文件的路径(如果需要删除环境变量,需要在~/.bashrc中删除环境变量后,关掉终端,重新启动终端才能生效)
       	3.重新加载配置文件 source ~/.bashrc
       	4.编译时要指定库名
        		gcc main.c -lmath(-l是在编译时加库,math是libmath.so去掉lib和.so)
    设置编译参数:-L共享库的路径
    	gcc main.c -L共享库的路径 -lmath 
    

    3、运行

    在使用共享库时,调用者只是记录了被代码在库的位置,因此在执行时需要共享库同时被加载。操作系统会根据LD_LIBRARY_PATH环境变量的设置来加载共享库。

    展开全文
  • [转]Linux下共享库(SO)有关的几个环境变量 Linux支持共享库已经有悠久的历史了,不再是什么新概念了。大家都知道如何编译、连接以及动态加载(dlopen/dlsym/dlclose) 共享库。但是,可能很多人,甚至包括一些高手,...
  • linux下共享库的注意点之-fpic 在编译共享库必须加上-fpic。这是为什么呢? 首先看一个简单的例子: #include <stdio.h> int fun1() { printf("fun1\n"); } 先不加-fpic的情...
  • 如果有,那么会将其看成为路径,在该路径加载共享库。如果没有协议,按一下方式搜索:  1)如果可执行文件的DT_RPATH运行时库路径列表中包含目录,但不包含DT_RUNAPTH列表时,那么在该包含目录中搜索改共享库。 ...
  • Linux下共享库的制作与使用

    千次阅读 2008-03-26 16:12:00
    Linux下共享库的制作与使用还是使用上面的例子程序: 生成共享库(动态链接库):#>gcc -fpic -shared -o libstr.so Strlen.c Strnlen.c-fpic 使输出的对象模块是按照可重定位地址方式生成的。-shared指定把对应的...
  • 接触linux时间不长,总是感觉底气不足,很多东西总是感到迷迷糊糊,其实是因为没找拿到linux C的两把钥匙: makefile和动态库、共享库linux C中几乎所有的程序都是以库的形式给出,如要要部署,必须知道如何修改...
  • Linux下共享库的查找顺序

    千次阅读 2017-02-21 00:07:01
    在接手一个很古老的程序时,发现其所使用的动态都实在是太陈旧了,正式运行环境中部署的都是相适应的,而目前的开发测试环境中均是部署的新的升级版本...因此在这里复习一下linux中程序对动态链接的搜索顺序,如
  • Linux下共享库的理解

    2010-10-24 23:13:00
    Linux下共享库类似windows下的dll,共命令约定如下:静态库一般由字母 lib 开头,并有 .a 的扩展名,而共享对象有两个不同的名称:soname 和 real name。soname 包含前缀 "lib",然后紧跟库名,其次是 ".so"(后面...
  •  1、编译 2、设置库名:   库的名称格式:lib + XXX + 版本号.so (库的名称为XXX)-shared 生成共享文件库 -fpic 动态链接  3、把头文件和.so文件放到系统目录(使用共享库了,把之前的#include “list.h” ...
  • 共享库:没复制函数,只是记录了用了哪些符号,在哪用。代码少,多程序可共享一个库。但是运行时还需要共享库。升级方便。系统更多的使用的是共享库。 二创建和使用:1。确定函数和函数接口2。编译gcc -c -fPIC hello...
  • Linux下共享库的创建和使用示例

    千次阅读 2015-07-08 16:35:42
    动态链接库是一种代码共享形式,便于模块化的开发与扩展。作为开发人员有必要详细了解其过程。...ldconfig负责维护soname到实际共享库的链接的高速缓冲文件 高速缓冲文件中维护的链接关系被ld.so在加载时进行使用。
  • 备注:在qt中的写法: ROOTFS=/home/vk/qt4/ OPENESLIB = $${ROOTFS}usr/lib/ LIBS += -L$${OPENESLIB} -lGLESv2 -lEGL QMAKE_LFLAGS += -Wl,-rpath=...动态 librabbitmq_r.so 内部依赖动态 libevent_core.so ...
  • linux下共享库(.so文件)的调用

    千次阅读 2018-01-23 15:38:36
    记住 复制文件的时候千万不要用ROOT权限,不然编译时会找不到这个共享库。最好时把库放到/usr/lib chmod 777  chown username CMakeLists.txt写法: link_directories(/home/yanlei/catkin_new/src/motordriver...
  • 在编译共享库必须加上-fpic。这是为什么呢? 首先看一个简单的例子: #include <stdio.h> int fun1() { printf("fun1\n"); } 先不加-fpic的情况生成库,反汇编查看fun1的机器码 0000044c &...
  • 1.创建共享库 [xpan@localhost 2.5.3]$ lslibhello.c libhello.h usehello.c[xpan@localhost 2.5.3]$ gcc -fPIC -Wall -g -c libhello.c 参数说明: -fPIC 参数生成与位置无关的代码; -W 或 -Wall 去除所有警告...
  • Linux下共享库路径配置问题 问题由来: 安装了程序,执行时报错: error while loading shared libraries: libmsg_queue.so.0: cannot open shared object file:  No such file or directory ...
  • 动态 librabbitmq_r.so 内部依赖动态 libevent_core.so 和 libevent_pthreads.so ; 可执行程序 sa 依赖动态 librabbitmq_r.so ; 在链接生成 sa 的时候希望只指定 librabbitmq_r.so 而不指定 libevent_core.so...
  • 有些情况可能会想知道,我这个程序链接的到底是在哪个目录。 有两种方式可以简单的处理。 1. 静态查找 $ locate lib_name 2. 动态执行 $ strace app 2>&1 | grep lib_name 下面举一下例子。 ubuntu 64...
  • 在使用qvfb做framebuffer模拟的时候,...由于在Ubuntu编译qvfb缺少了很多文件,而在没有网络的情况,补齐这些和头文件是非常麻烦的,所以准备在fedora中编译好后再放到Ubuntu中使用.由于Ubuntu和fedoraqtsdk的...
  • 原文链接:http://zhiwei.li/text/2009/04/linux%E4%B8%8B%E5%85%B1%E4%BA%AB%E5%BA%93%E7%9A%84%E9%9A%90%E5%BC%8F%E5%92%8C%E6%98%BE%E5%BC%8F%E9%93%BE%E6%8E%A5/
  • linux下共享库的一个有用工具objdump

    千次阅读 2013-03-26 18:56:24
    objdump可以用来得到共享库的SONAME, RPATH, 依赖库等等重要信息,具体用法如下: 1. 获取共享库 objdump -x libfoo.so | grep NEEDED 输出结果如下:  NEEDED libinit-1.0.so.0  NEEDED libgui.so  ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,102
精华内容 1,240
关键字:

linux下共享库

linux 订阅