首页 > 系统服务 > 详细

linux下制作库

时间:2020-01-10 11:29:57      阅读:54      评论:0      收藏:0      [点我收藏+]
linux下-动态库 静态库
   
1.库是什么?
    二进制文件
    将源代码 -> 二进制格式的源代码
            .c     .cpp
     能干什么?
        加密,保护知识产权
 
2.库制作出来之后,如何给用户使用?
    头文件
    制作出的库
 
    windows静态库 :   xxx.lib
    windows动态库 :   xxx.dll
 
3.静态库的制作和使用
    命名规则
        前缀:
            lib
        库的名字
            xxx 
        后缀
            .a    
        例如:    libtest.a
 
    制作步骤
        原材料:    源代码    .c    .cpp
        将 .c 文件生成 .o
            gcc a.c b.c -c
        将 .o打包
            ar rcs 静态库的名字 原材料
            ar rcs  libtest.a  a.o b.o 
 
        查看库的内容
            nm libtest.a
 
    库的使用
            提供 include(头文件)  libtest.a 给用户
            gcc test.c -I ./include/ -L ./lib/ -l test -o app
        //静态库的名字 test 掐头去尾, 去掉 lib 和 .a
        //-L ./lib/ 静态库的路径
        gcc main.c -I ./include -L ./lib/ -l test -o app
 
4.动态库的制作和使用
    命名规则
        前缀:
            lib
        库的名字
            xxx 
        后缀
            .so    //.so.1.7  版本
        libxxx.so
    制作步骤
        将源文件生成 .o 
            gcc a.c b.c -c  -fpic(fPIC)
        打包
            gcc -shared a.o b.o -o libxxx.so 
            gcc -shared -o libxxx.so a.o b.o
 
    库的使用
        提供 include(头文件)  libtest.so 给用户
       头文件    a.h
       参考函数声明编译测试程序 main.c
            gcc main.c -I ./ -L ./ -l test -o app     //-l test   -ltest 有没有空格都行
 
    对于elf格式的可执行程序,是由ld-linux-so* 来完成的,它先后搜索 elf 文件的DT_RPATH段 -- 环境变量 LD_LIBRARY_PATH -- /etc/ld.so.cache 文件列表 -- /lib/ -- /usr/lib目录找到库文件后将其载入内存
 
    ldd 查看可执行程序所需要的链接文件
    env 查看path环境变量
    echo $PATH    输出path环境变量信息
 
    解决动态库加载失败的问题
        使用环境变量
            临时设置:
                export LD_LIBRARY_PATH=动态库的绝对路径
                export LD_LIBRARY_PATH=动态库的绝对路径:$LD_LIBRARY_PATH   (防止覆盖原来的环境变量,这样做更加安全)
 
            永久设置:
                用户级别
                    ~/.bashrc
                        LD_LIBRARY_PATH=动态库的绝对路径 写到文件里面
                        LD_LIBRARY_PATH=动态库的绝对路径:$LD_LIBRARY_PATH   (防止覆盖原来的环境变量,这样做更加安全)
                    配置完成
                        -- 重启终端
                        source ~/.bashrc
                系统级别
                    etc/profile
                        LD_LIBRARY_PATH=动态库的绝对路径 写到文件里面
                        LD_LIBRARY_PATH=动态库的绝对路径:$LD_LIBRARY_PATH   (防止覆盖原来的环境变量,这样做更加安全)
                    配置完成
                        -- 重启终端
                        source /etc/profile
 
     文件列表 /etc/ld.so.cache 
        找到一个配置文件
            sudo vi /etc/ld.so.conf
            把动态库绝对路径添加到文件中
       例:
      /home/mrchen/share/linux_basis/day02/3_dynamicLib
 
        执行一个命令
            sudo ldconfig [-v]
 
知识点拓展:            回调函数
    dlopen        dlclost    dlsym
 
静态库    动态库优缺点
    静态库:
        优点:
            静态库被打包到应用程序中加载速度快
            发布程序无需提供静态库,移植方便
 
        缺点:        
            浪费系统资源,浪费内存
            更新,部署,发布麻烦
 
    动态库:
            gcc test.c -L ./ -l test -o app
        ./app   
            app制作好之后,动态库没有打包在app中
            ./app 动态库不会被加载,当程序调用动态库中的函数的时候,动态库才会被加载。
            程序运行之前会先判断库是否存在
                动态链接器 ls.so-x86.64
       优点:
            可实现进程间资源共享
            程序升级简单
            程序员可以控制何时加载动态库
 
        缺点:        
            加载速度比静态库慢
            发布程序需要提供依赖的动态库
技术分享图片

 

 

linux下制作库

原文:https://www.cnblogs.com/period/p/12174855.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!