Linux库文件使用与编译

介绍在Linux下使用静态库、共享库、动态库的方法。

Linux库文件

  • 静态库
    • 在Linux中,以.a为后缀,如libtest.a
    • 直接拷贝函数到二进制映像文件
    • 只需要运行二进制文件,可以直接运行
  • 共享库
    • 在Linux操作系统中,以libxxx.so.x.x为格式命名
    • 可执行文件在开始运行时将函数从共享库文件中读出,从而间接引用
    • 好处是,当函数接口没变,实现改变时,不需要再次编译
  • 动态库
    • 动态加载库在指定位置加载的函数库
    • 可以减少内存开销

库函数基本路径

  • /lib
    • 标准共享库和静态库
  • /usr/lib
    • 标准共享库和静态库
  • /usr/local/lib
    • 本地函数库

库文件搜索顺序

  1. 首先在“LD_LIBRARY_PATH”环境变量所设置的路径下查找(一般都没有给此环境变量赋值)
  2. 搜索动态装载器在/etc目录下的缓存文件/etc/ld.so.cache(此文件由命令ldconfig创建更新)。
  3. ldd命令–查看到某可执行程序共享库清单

创建静态库

  • libhello.c为要构建的库文件源文件,libhello.h为调用此库文件的头文件,usehello.c为测试程序。

    • 53922333150
  • 首先将所需要文件编译成目标文件

    • gcc -c libhello.c
      
             
             
      • 1
  • 使用ar命令创建静态库

    • ar rc libhello.a libhello.o
      
             
             
      • 1
  • 编译运行

    • gcc -o usehello_static usehello.c libhello.a
      
             
             
      • 1
  • 53922368937

创建共享库

  • 首先将所需要的库编译成目标代码,这里生成与位置无关,可以在任何地址被链接和装载:

    • gcc -fPIC -Wall -g -c libhello.c
      
             
             
      • 1
  • 使用-shared来创建共享库

    • gcc -g -shared -Wl,-soname,libhello.so.1.0 -o libhello.so.1.0 libhello.o
      
             
             
      • 1
    • 这里的so.1.0表示对应的完整版本号,具体可参考这里

  • 创建soname连接:

    • ln -sf libhelloso.1.0 libhello.so
      
             
             
      • 1
    • 这里创建一个链接,只是为了方便以后版本更新时,只需要更改链接的路径,不改变编译代码

  • 编译并连接引用库文件

    • gcc -Wall -g -c usehello -o usehello.o
      gcc -g -o usehello_dynamic usehello.o -L ./ -lhello //连接引用库文件
      
             
             
      • 1
      • 2
    • 其中,-L表示搜索路径,./表示搜索当前路径

    • -lhello

      • 会自动在-l前变为lib,加上.so,变为libhello.so
  • 运行,需要添加当前目录pwd到环境变量中

    • LD_LIBRARY_PATH=$(pwd) ./usehello_dynamic 
      
             
             
      • 1
  • 如果希望在使用连接器时不使用-Ldirectory标识就可以查找到该库,则可以采用以下方式之一:

    • 把此库拷贝到/usr/lib或者/lib文件夹中,或者在此两个文件夹任意一个中创建一个到该库的快捷方式,并命名为libname.so
    • 如果库所在路径没有在/usr/lib和/lib文件夹下,需要将该路径添加到文件“/etc/ld.so.conf”中,每一行增加一个路径,完成以上设置后,然后运行ldconfig命令更新库信息。

动态库

  • 在Linux中,动态库的文件格式跟共享库没有区别,主要区别在于共享库是运行时加载。

  • 有专门的一组API用于完成打开动态库,查找符号,处理出错,关闭动态库等功能。

    • dlopen
    • dlerror
    • dlsym
    • dlclose
  • 使用示例

    • 53924215058

                                </div>
            <link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-b6c3c6d139.css" rel="stylesheet">
                                <div class="more-toolbox">
            <div class="left-toolbox">
                <ul class="toolbox-list">
                    
                    <li class="tool-item tool-active is-like "><a href="javascript:;"><svg class="icon" aria-hidden="true">
                        <use xlink:href="#csdnc-thumbsup"></use>
                    </svg><span class="name">点赞</span>
                    <span class="count">1</span>
                    </a></li>
                    <li class="tool-item tool-active is-collection "><a href="javascript:;" data-report-click="{&quot;mod&quot;:&quot;popu_824&quot;}"><svg class="icon" aria-hidden="true">
                        <use xlink:href="#icon-csdnc-Collection-G"></use>
                    </svg><span class="name">收藏</span></a></li>
                    <li class="tool-item tool-active is-share"><a href="javascript:;"><svg class="icon" aria-hidden="true">
                        <use xlink:href="#icon-csdnc-fenxiang"></use>
                    </svg>分享</a></li>
                    <!--打赏开始-->
                                            <!--打赏结束-->
                                            <li class="tool-item tool-more">
                        <a>
                        <svg t="1575545411852" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5717" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M179.176 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5718"></path><path d="M509.684 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5719"></path><path d="M846.175 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5720"></path></svg>
                        </a>
                        <ul class="more-box">
                            <li class="item"><a class="article-report">文章举报</a></li>
                        </ul>
                    </li>
                                        </ul>
            </div>
                        </div>
        <div class="person-messagebox">
            <div class="left-message"><a href="https://blog.csdn.net/crazy_scott">
                <img src="https://profile.csdnimg.cn/B/E/0/3_crazy_scott" class="avatar_pic" username="crazy_scott">
                                        <img src="https://g.csdnimg.cn/static/user-reg-year/2x/2.png" class="user-years">
                                </a></div>
            <div class="middle-message">
                                    <div class="title"><span class="tit"><a href="https://blog.csdn.net/crazy_scott" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;}" target="_blank">crazy_scott</a></span>
                                        </div>
                <div class="text"><span>发布了171 篇原创文章</span> · <span>获赞 92</span> · <span>访问量 23万+</span></div>
            </div>
                            <div class="right-message">
                                        <a href="https://im.csdn.net/im/main.html?userName=crazy_scott" target="_blank" class="btn btn-sm btn-red-hollow bt-button personal-letter">私信
                    </a>
                                                        <a class="btn btn-sm  bt-button personal-watch" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;}">关注</a>
                                </div>
                        </div>
                </div>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值