• Linux静态库与共享库


    date: 2017-06-19 23:01:32

    静态库与共享库

    所谓“程序库”,简单说,就是包含了数据和执行码的文件。其不能单独执行,可以作为其他执行程序的一部分来完成某些功能。库的存在,可以使得程序模块化,可以加快程序的再编译,可以实现代码重用,可以使得程序便于升级。程序库可分为静态库(static library)和共享库(shared object)。

    静态库,是在可执行程序运行前就已经加入到执行码中,成为执行程序的一部分;共享库,实在执行程序启动时加载到执行程序中,可以被多个执行程序共享使用,类似与windows下的dll文件。

    静态库

    静态库在应用程序生成时,可以不必再编译,节省再编译时间。但意义不大。当其他开发人员要使用我的程序,而我又不想给其源码,提供静态库是一种选择。 以.a结尾。
    创建动态库或将目标代码加入到已经存在的静态库中,使用命令:

    ar rcs libmylib.a file1.o
    

    共享库

    共享库的创建基本分两步。首先使用-fPIC或-fpic创建目标文件,PIC或pic表示位置无关代码,然后就可以使用以下格式创建共享库了。下面是使用a.c和b.c创建库的示例:

    gcc -fPIC -c a.c
    gcc -fPIC -c b.c
    gcc -shared -Wl -o libmylib.so a.o b.o
    或
    gcc -fPIC -c *.c
    gcc -shared -Wl,-soname,libmylib.so.1 -o libmylib.so.1.0.1 a.o b.o
    

    按共享库的命名惯例,每个共享库有三个文件名:realname,soname和linkername.
    真正的库文件是realname,包含完整的共享库版本号。如libmylib.so.1.10
    soname为库的主版本号。添加共享库路径之后,自动生成libmylib.so.1
    linkname为软链接,编译链接阶段使用,方便makefile。当共享库版本改变时,不需要再修改makefile内容,需要手动创建。

    ln -s libmyab.so.1.0.1 libmyab.so
    

    添加共享库的路径:

    1、修改/etc/ld.so.conf

    sudo vi /etc/ld.so.conf
    

    2、更新查找共享库的路径

    sudo ldconfig -v
    

    如果没有成功,可能需要删除ld.so.cache缓存文件

    sudo rm /etc/ld.so.cache
    

    ldd app 查看app所依赖的共库

    yz@ubuntu14:~/桌面$ ldd app
    linux-vdso.so.1 =>  (0x00007ffe41ffc000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f10f13f8000)
    /lib64/ld-linux-x86-64.so.2 (0x00005570aedd1000)
    

    体验

    tree
    
    ├── add.h
    ├── lib
    ├── main.c
    └── src
        ├── add.c
        └── add.h
    
    cat main.c src/add.h src/add.c
    
    #include <stdio.h>
    #include "add.h"
    
    
    int main(void)
    {
    	printf("%d
    ", add(4, 5));
    	return 0;
    }
    #ifndef ADD_H_
    #define ADD_H_
    
    int add(int a, int b);
    
    #endif
    #include "add.h"
    
    int add(int a, int b)
    {
    	return a + b;
    }
    
    cd src && gcc -fPIC -c add.c
    

    在scr下产生了add.o文件

    gcc -shared -Wl,-soname,libmyadd.so -o libmyadd.so.1.10 add.o
    
    

    在scr下产生了libmyadd.so.1.10文件

    ar rcs libmyadd.a add.o
    

    在scr下产生了libmyadd.a文件

    cp libmyadd.a libmyadd.so.1.10 ../lib/
    

    将libmyadd.a libmyadd.so.1.10复制到lib文件夹中

    cd ..
    gcc main.c lib/libmyadd.a -o app
    ./app
    

    输出9,静态库测试成功

    sudo vim /etc/ld.so.conf
    

    添加共享库路径:/home/yz/桌面/ku/lib

    sudo ldconfig -v
    

    更新共享库的路径,这时候在lib下产出了libmyadd.so.1 -> libmyadd.so.1.10

    ln -s libmyadd.so.1.10 libmyadd.so
    

    再创建一个linkname,不是必须的

    gcc main.c lib/libmyadd.so -o app1
    ./app1
    

    输出9,共享库测试成功

  • 相关阅读:
    Springboot2.0之HikariCP 连接池
    Spring Kafka中关于Kafka的配置参数
    Spring @Async异步线程池 导致OOM报错的原因
    JDK 8 函数式编程入门
    Spring自定义argumentResolver参数解析器
    Kafka消费异常处理
    Java项目生成可执行jar包、exe文件以及在Windows下的安装文件
    Mysql索引研究总结
    windows安装zookeeper
    JVM中的堆和栈
  • 原文地址:https://www.cnblogs.com/cloudflow/p/13894138.html
Copyright © 2020-2023  润新知