• 静态库和共享库


    静态库和共享库

    共享库相当于c++中的dll。静态库是在可执行程序运行前就已经加入到执行代码中,成为执行程序的一部分,按照习惯一般以.a作为文件后缀名,使用ar命令可以创建静态库,静态库在应用程序生成时,可以不必载编译,节省再编译时间;共享库,是在执行程序启动时加载到执行程序中,可以被多个执行程序共享使用。

    本节所讲的执行程序和库都采用ELF格式。

    一、静态库

    要创建一个静态库,或要将目标代码加入到已经存在的静态库中,可以用以下命令

    ar  rcs libmylib.a file1.o

    若libmylib不存在,会自动创建一个。然后更新.a文件的索引,使之包含新加入的.o命令。静态库创建成功后,需要链接到应用程序中使用。使用gcc的-l选项来指定静态库,使用-L参数来指定库文件的搜索路径。

    二、共享库

    共享库的创建比较简单,基本有两步。首先使用-fPIC或-fpic创建目标文件,pic表示位置无关代码(寻找是以相对路径,偏移地址而不是绝对路径,开发往往要求与位置无关,不管放在内存的哪个位置都可以执行),然后就可以使用以下格式创建共享库了:gcc -share -W1,-soname,your_soname -o library_name file_list library_list

    共享库寻址

    示例:

    1.gcc  -fPIC -c a.c   //-c只编译,生成.o文件,不进行链接

    gcc -fPIC  -c b.c

    gcc -shared -W1 -o  libmyab.so a.o b.o

    gcc -shared -W1,-soname,libmyab.so.1  -o  libmyab.so.1.10 a.o b.o

    按照共享库的命令惯例,每个共享有三个文件名:real name、soname和linker name。真正的库文件(而不是符号链接),共享库一般都是以.so为后缀,中的。1.0.1表示版本号,real nam为libmyab.so.1。

                                                                   共享库命名

             so name主要是用来判断此app的主版本号能否在此电脑上库运行,主要工作在运行阶段,link name没有出现任何版本信息,方便编译链接使用,若版本号改变,只要将link name重新链接就好,其他使用到link name的地方都不需要更改,方便Makefile

    2.共享库加载

    (1)修改/etc/ld.so.conf

    sudo vi /etc/ld.so.conf

    添加你的共享库路径

    ldd 程序名,能够查找程序执行时候依赖于哪些库

    (2)更新查找共享库路径

    sudo   ldconfig -v

    (3)ln -s  libmycal.so1.10 libmycal.so  手动创建一个link name

     静态库和共享库的工作关系

  • 相关阅读:
    Go学习2-切片
    Go学习1-MOD
    lua学习之逻辑运算符not,and,or
    google protobuf c++ 反射
    我要谴责一下,你们复制别人的答案好歹仔细看看
    远程登录redis
    openssl进行RSA加解密(C++)
    linux通过进程名查看其占用端口
    简体字丶冯|服务网关kong-docker安装
    简体字冯|docker-安装docker私有库
  • 原文地址:https://www.cnblogs.com/rainbow1122/p/7793724.html
Copyright © 2020-2023  润新知