精华内容
下载资源
问答
  • Linux下链接动态库静态库的理解 [日期:2009-04-18] 来源:Linux社区 作者:dingjoey   Linux程序GCC编译基本过程 一个程式从原始码到可执行文件(或共享库文件),一般都要经过预处理、编译...

    Linux下链接动态库静态库的理解

    [日期:2009-04-18]            来源:Linux社区  作者:dingjoey

     

    Linux程序GCC编译基本过程

    一个程式从原始码到可执行文件(或共享库文件),一般都要经过预处理、编译、汇编和链接这四个步骤。

    编译过程扫描头文件的搜索路径顺序

    gcc 在编译时如何去寻找所需要的头文件 :

    ※所以header file的搜寻会从-I开始

    ※然后找gcc的环境变量 C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PATH

    1.编译目标代码时指定的动态库搜索路径;

    2.环境变量LD_LIBRARY_PATH指定的动态库搜索路径;

    3.配置文件/etc/ld.so.conf中指定的动态库搜索路径;

    4.默认的动态库搜索路径/lib;

    5.默认的动态库搜索路径/usr/lib。

    有关环境变量:

    LIBRARY_PATH环境变量:指定程序静态链接库文件搜索路径

    LD_LIBRARY_PATH环境变量:指定程序动态链接库文件搜索路径

    链接过程

     建立静态库方法(包括静态内部库和动态外部库)

    gcc -c fun.c

    ar cqs libfun.a fun.o

     编译中使用静态库方法

    gcc call.c -static -L. -lfun -o fun_static_call

     建立动态库(包括动态内部库和动态外部库)

    gcc fun.c -fPIC -shared -o libfun.so

     编译中使用动态库方法

    gcc call.c -L. -lfun -o fun_dyn_call

    编译器会先在path文件夹下搜索libxxx.so文件,如果没有找到,继续搜索libxxx.a(静态库)。

    执行过程

     无论是使用动态库还是外部库链接时都是使用的ld连接器;

     使用动态库的程序执行时使用动态加载器。在Linux 下,加载器是/lib/ld-Linux.so.X(X是版本号)。然后加载器搜索、加载程序所要使用的动态链接库。搜索顺序见上。

     

    展开全文
  • 一个程式从原始码到可执行文件(或共享文件),一般都要经过预处理、编译、汇编和链接这四个步骤。 编译过程扫描头文件的搜索路径顺序 gcc 在编译时如何去寻找所需要的头文件 : ※所以header file的搜寻...

    Linux程序GCC编译基本过程

    一个程式从原始码到可执行文件(或共享库文件),一般都要经过预处理、编译、汇编和链接这四个步骤。

    编译过程扫描头文件的搜索路径顺序

    gcc 在编译时如何去寻找所需要的头文件 :

    ※所以header file的搜寻会从-I开始

    ※然后找gcc的环境变量 C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PATH

    ※再找内定目录

    /usr/include

    /usr/local/include

    /usr/lib/gcc-lib/i386-linux/2.95.2/include

    /usr/lib/gcc-lib/i386-linux/2.95.2/../../../../include/g++-3

    /usr/lib/gcc-lib/i386-linux/2.95.2/../../../../i386-linux/include

    库文件但是如果装gcc的时候,是有给定的prefix的话,那么就是

    /usr/include

    prefix/include

    prefix/xxx-xxx-xxx-gnulibc/include

    prefix/lib/gcc-lib/xxxx-xxx-xxx-gnulibc/2.8.1/include

    尤其注意链接过程是本文要重点讨论的:

    链接步骤要经历链接内部库(即当前程序源码编译而成的.a,.o,.so)和外部库(依赖的外部静态lib.a、动态库lib.so)

    外部库

    外部库有两种: (1)静态连接库lib.a

           (2)共享连接库lib.so

    共同点:

    .a, .so都是.o目标文件的集合,这些目标文件中含有一些函数的定义(机器码),而这些函数将在连接时会被最终的可执行文件用到。

    区别:

    静态库.a  : 当程序与静态库连接时,库中目标文件所含的所有将被程序使用的函数的机器码被copy到最终的可执行文件中。

    共享库.so : 与共享库连接的可执行文件只包含它需要的函数的表,而不是所有的函数代码,在程序执行之前,那些需要的函数代码被拷贝到内存中,这样就使可执行文件比较 小,节省磁盘空间(更进一步,操作系统使用虚拟内存,使得一份共享库驻留在内存中被多个程序使用)。共享库还有个优点:若库本身被更新,不需要重新编译与 它连接的源程序。

    Linux下库是如何产生的

    静态库的后缀是.a,它的产生分两步

    Step 1.由源文件编译生成一堆.o,每个.o里都包含这个编译单元的符号表

    Step 2.ar命令将很多.o转换成.a,成文静态库

    动态库的后缀是.so,它由gcc加特定参数编译产生。

    例如:

    $ gcc -fPIC -c *.c $ gcc -shared -Wl,-soname, libfoo.so.1 -o libfoo.so.1.0 *.

    Linux下库文件是如何命名的,如何存放

    静态库的名字一般为libxxxx.a,其中xxxx是该lib的名称

    动态库的名字一般为libxxxx.so.major.minor,xxxx是该lib的名称,major是主版本号, minor是副版本号

    Linux下,库文件一般放在/usr/lib /lib下,

    如果安装在/lib或者/usr/lib下,那么ld默认能够找到,无需其他操作。

    如果安装在其他目录,需要将其添加到/etc/ld.so.cache文件中,步骤如下

    1.编辑/etc/ld.so.conf文件,加入库文件所在目录的路径

    2.运行ldconfig,该命令会重建/etc/ld.so.cache文件

    Linux中有关编译链接要是用的库扫描路径,与有关环境变量

    静态库链接时搜索路径顺序:

    1.ld会去找GCC命令中的参数-L

    2.再找gcc的环境变量LIBRARY_PATH

    3.再找内定目录 /lib /usr/lib /usr/local/lib 这是当初compile gcc时写在程序内的

    动态链接时、执行时搜索路径顺序:

    1.编译目标代码时指定的动态库搜索路径;

    2.环境变量LD_LIBRARY_PATH指定的动态库搜索路径;

    3.配置文件/etc/ld.so.conf中指定的动态库搜索路径;

    4.默认的动态库搜索路径/lib;

    5.默认的动态库搜索路径/usr/lib。

    有关环境变量:

    LIBRARY_PATH环境变量:指定程序静态链接库文件搜索路径

    LD_LIBRARY_PATH环境变量:指定程序动态链接库文件搜索路径

    链接过程

     建立静态库方法(包括静态内部库和动态外部库)

    gcc -c fun.c

    ar cqs libfun.a fun.o

     编译中使用静态库方法

    gcc call.c -static -L. -lfun -o fun_static_call

     建立动态库(包括动态内部库和动态外部库)

    gcc fun.c -fPIC -shared -o libfun.so

     编译中使用动态库方法

    gcc call.c -L. -lfun -o fun_dyn_call

    编译器会先在path文件夹下搜索libxxx.so文件,如果没有找到,继续搜索libxxx.a(静态库)。

    执行过程

     无论是使用动态库还是外部库链接时都是使用的ld连接器;

     使用动态库的程序执行时使用动态加载器。在Linux 下,加载器是/lib/ld-Linux.so.X(X是版本号)。然后加载器搜索、加载程序所要使用的动态链接库。搜索顺序见上。


    查看库中的符号

      有时候可能需要查看一个库中到底有哪些函数,nm命令可以打印出库中的涉及到的所有符号。库既可以是静态的也可以是动态的。nm列出的符号有很多,常见的有三种:

      一种是在库中被调用,但并没有在库中定义(表明需要其他库支持),用U表示;

      一种是库中定义的函数,用T表示,这是最常见的;

      另外一种是所谓的“弱 态”符号,它们虽然在库中被定义,但是可能被其他库中的同名符号覆盖,用W表示。


    展开全文
  • gcc -shared -fpic add.o sub.o -o ...(一)此时动态库文件只在当前目录 ① gcc main.c -o main -L./ -lcount1 //编译通过:-L指定动态库文件所在路径,l指定库文件名 ./main //运行报错:error while ...

    一、gcc链接动态库编译时-L的问题

    gcc -shared -fpic add.o sub.o -o libcount1.so  
    //(-l(小写l)指定动态库文件名)
    //生成动态库文件libcount1.so
    

    (一)此时动态库文件只在当前目录下

    gcc main.c -o main -L./ -lcount1
    //编译通过:-L指定动态库文件所在路径,l指定库文件名
    
    ./main
    //运行报错:error while loading shared libraries: libcount1.so: cannot open shared object file:
    //          加载共享库时出错:libcount1。因此:无法打开共享对象文件:没有这样的文件或目录
    //原因?(看结论)
    

    gcc main.c -o main -lcount1
    //编译时没有用-L指定动态库文件所在路径
    //编译报错 /usr/bin/ld: cannot find -lcount1
    //          /usr/bin/ld下找不到count1
    //原因?(看结论)
    

    (二)将动态库文件libcount1.so复制到/lib/下,但原目录下动态库文件并未删除 :

    sudo cp libcount1.so /lib/
    

    gcc main.c -o main -L./ -lcount1
    //编译通过
    //运行通过
    

    gcc main.c -o main -lcount1
    //编译通过
    //运行通过
    

    (三)将动态库文件libcount1.so复制到/lib/后,并且删除原目录下动态库文件 :

    rm libcount1.so
    

    gcc main.c -o main -L./ -lcount1
    //编译通过
    //运行通过
    

    gcc main.c -o main -lcount1
    //编译通过
    //运行通过
    

    结论:在linux下gcc编译时如果需要链接动态库文件,则有两个链接过程:
    编译时链接,运行时链接

    编译时链接:系统会优先从-L指定的路径查找库文件,若没有则从/lib/下查找,所以如果/lib/下面有所需静态库文件则-L可省略,链接之后的文件会记住动态库里面相应的函数地址

    运行时链接:系统会直接在/lib/下查找所需动态库文件,若没有则运行报错,找到后将相应函数定义链接进来然后执行

    所以实际上用-L指定动态库文件路径只能保证编译通过,是否能执行还是得看/lib/下面有没有该库文件

    二、gcc编译链接静态库时-L的问题

    ar -rc libhaha.a add.o sub.o
    //生成静态库文件libhaha.a
    

    此时动态库文件只在当前目录下

    gcc main.c -o main -L./ -lhaha
    //编译通过
    //运行通过
    
    gcc main.c -o main -lhaha
    //编译报错
    //usr/bin/ld: cannot find -lhaha
    // /bin/下无法找到静态库文件
    

    结论:在进行编译链接静态库时,必须用-L指定静态库文件路径即可编译并运行通过,因为链接静态库时只有编译时来链接而没有运行时链接所以不需要将静态库放到/lib/下面

    展开全文
  • LINUX下动态链接库的使用-dlopen dlsym dlclose dlerror
  • 库的存在极大的提高了C/C++程序的复用性,但是库对于初学者来说有些难以驾驭,本文从Linux的角度浅谈Linux下的静态库、动态库和动态加载库。  Linux库类型  Linux下可以创建两种类型的库:  1、静态库(.a): 在...
  • 主要介绍了Linux下动态链接库加载路径及搜索路径问题,需要的朋友可以参考
  • Windows与Linux下动态链接库的区别

    万次阅读 2021-02-27 18:32:19
    Windows使用MinGW32 g++,Linux下使用GNU g++ 一、Windows Windows的动态链接库的命名格式为lib*.dll。 使用CMake创建动态链接库时,会生成两个文件,比如 下面代码是在CMakeLists.txt中描述的依赖关系,在...

    本文所述基于以下两点,

    1. 使用CMake进行项目的构建
    2. Windows下使用MinGW32 g++,Linux下使用GNU g++

    一、Windows

    Windows的动态链接库的命名格式为lib*.dll。

    使用CMake创建动态链接库时,会生成两个文件,比如

    下面代码是在CMakeLists.txt中描述的依赖关系,在cmake构建过程中,会在上下文规定的路径中寻找“libcurldll.a”、“libbase64.a”,即在前后分别自动添加上“lib”和“.a”。

    libcurldll.a是用在项目构建过程中添加动态库依赖的,libcurl.dll是程序运行时加载的动态库,并且需要将libcurl.dll放到可执行文件同一目录下,才能正常加载。

    target_link_libraries(
        MAIN 
        "curldll"
        "base64"
    )

    二、Linux

    Linux的动态链接库的命名格式为lib*.so。

    使用CMake创建动态链接库时,只会生成一个文件,比如

    生成的libbase64.so可用于运行时加载。

    在CMakeLists.txt中描述的依赖关系如下图。

    在cmake构建过程中,会在上下文规定的路径中寻找“libbase64.so”,即在前后分别自动添加上“lib”和“.so”。

    在CMakeLists.txt中规定的链接路径如下,程序会在以下路径中查找需要加载的动态库,不可移动至其他路径。

    如果在上述路径中找不到动态库,会报错如下,

    展开全文
  • linux下c语言动态库生成方法

    千次阅读 2016-08-08 14:53:44
    Linux下动态库文件的扩展名为".so"(Shared Object)。按照约定,所有动态库文件名的形式是libname.so(可能在名字中加入版本号)。静态库的文件名形式是libname.a。 本文仅以简单的例子介绍动态库文件的生成和...
  • linux下动态库的生成和链接

    千次阅读 2016-05-03 07:57:50
    linux下动态库的生成和链接(.so) 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。 windows和linux下都存在库,但不同。 静态库:.a 文件。静态库在程序编译时会被连接到目标代码中...
  • linux qt 动态链接库

    2011-08-15 15:23:18
    linux qt 动态链接库linux qt 动态链接库linux qt 动态链接库linux qt 动态链接库linux qt 动态链接库linux qt 动态链接库
  • 文档详细介绍了Linux下动态链接库的生产以及连接方法,对于从事Linux C/C++的技术开发人员有一定帮助
  • 具体实现见我的文章地址如下: http://blog.csdn.net/csdn83419527/article/details/78840798 功能很简单就是把创建和使用动态库说清楚而已
  • linux下动态库与静态库

    千次阅读 2017-06-15 12:09:04
    说到静态库和动态库啊,不得不提的就是程序编译链接的过程,现在有很多的IDE我们很少去关注程序编译链接的本质,但是其背后的运行机制却是必须要我我们熟悉的,我之前写过一片就是C、C++程序的编译链接过程的博客,...
  • linux下QT链接动态库

    千次阅读 2019-04-18 11:27:35
    QT链接动态库.so 在.pro中空白地方右键添加库 选中你要链接的库,会自动在.pro中生成相对链接代码,完全不需要手动添加 如果你要使用链接的库函数,需要在你的项目头文件的中#include进来你所链接的库的头文件 这是...
  • Linux共享路径配置 Linux下找不到共享文件的典型现象为明明已经安装某个软包(如libnet,MySQL),编译连接可以正常进行,但是在运行时出现如“error while loading shared libraries: libnet.so.1:cannot open...
  • linux下so动态库一些不为人知的秘密

    千次阅读 2018-07-04 17:55:35
    linux 动态库和静态库,动态库以.so为扩展名,静态库以.a为扩展名。二者都使用广泛。本文主要讲动态库方面知识。 基本上每一个linux 程序都至少会有一个动态库,查看某个程序使用了那些动态库,使用ldd命令查看...
  • Linux下动态连接库及其实现机制.pdf
  • linux下使用动态库步骤

    千次阅读 2017-02-08 16:42:57
    linux下使用动态库步骤: ==========================...1. linux下动态库(.so)文件默认的查找路径:/lib和/usr/lib和/usr/local/lib 里的库直接用-l参数就能链接。 =======================================
  • Linux下生成动态链接库

    千次阅读 2018-04-18 17:32:53
    【摘要】动态链接库是在编译器编译之后生成 obj 文件之后,将几个链接文件和动态链接库中的文件链接起来,在链接器中将几个目标文件组合在一起然后生成可执行文件 exe 文件,而生成动态链接库的这一步骤是由编译器...
  • Linux下编译动态库及使用

    万次阅读 2017-12-20 18:14:43
    linux下生成和使用动态库的步骤如下: 1,编写源文件。 2,将一个或几个源文件编译链接,生成共享库。 3,通过 -L<path> -lxxx 的gcc选项链接生成的libxxx.so。 4,把libxxx.so放入链接库的标准路径,或...
  • 我们通常把一些公用函数制作成函数库,供其它程序使用。 函数库分为静态库和动态库两种。 静态库在程序编译时会被连接到...linux下编程动态库文件为.so文件,静态库文件为.a文件 本文主要通过举例来说明在Linux
  • 二、在应用程序需要连接外部库的情况linux默认对库的连接是使用动态库,在找不到动态库的情况再选择静态库。使用方式为: gcc test.cpp -L. -ltestlib 如果当前目录有两个库libtestlib.so libtestlib.a 则...
  • linux下生成静态库和动态库

    千次阅读 多人点赞 2016-11-09 22:25:46
    linux下生成静态库和动态库 一、动态库、静态库简介 库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。本质上来说库...
  • 本文描述了Linux下使用动态链接库和静态链接库的项目建立及单步调试
  • Linux下动态链接库的创建和使用

    千次阅读 2016-04-06 13:40:41
    Linux链接库的创建和使用 链接 动态链接的创建和使用 静态链接的创建和使用
  • 主要介绍了解决Linux程序编译链接动态库版本的相关问题,文中给出了详细的介绍和示例代码,相信对大家具有一定的参考借鉴价值,有需要的朋友们下面来一起看看吧。
  • Linux下指定动态库的加载路径

    千次阅读 2018-09-04 10:30:28
    一、库文件的搜索路径: 1、在配置文件/etc/ld.so....2、通过环境变量LD_LIBRARY_PATH指定动态库搜索路径(当通过该环境变量指定多个动态库搜索路径时,路径之间用冒号":"分隔) 3、在编译目标代码时指...
  • linux动态链接库示例

    2011-09-18 13:58:06
    linux动态链接库的制作,linux下制作动态链接库 C语言描述
  • Linux链接动态库的方式

    千次阅读 2018-04-21 17:09:41
    Linux下应用程序链接动态库有以下三种方式:改变LD_LIBRARY_PATHexport LD_LIBRARY_PATH=/home/bow/all/program/test/lib_version_test:$LD_LIBRARY_PATH这里/home/bow/all/program/test/lib_version_test是共享库的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 197,405
精华内容 78,962
关键字:

linux下链接动态库

linux 订阅