• linux下的静态库与动态库


    说的库,实质就是一些库函数,在我们编程的时候会用到,这样我们就可以避免重复写一此代码了。如: c/c++中的标准输入输出函数等,我们都是用得它们的库;

    静态库就是我们在编译我们的函数时,直接把要用的库的内容编译包含进去了,使它们成了一体了;而动态库呢,我们编译我们函数的时候不会直接把要使用到的库的内容包含进去,而是运行的时候再调用它;至于它们的缺点,用脑子想想就一目了然了。

    静态库:

    以 .a 为后缀,意思为 archive 文件;静态库通过命令 ar 得到;     命令 ar 把源码经过预处理、编译、汇编得到的 .o 文件通过包含起来,可以多个 .o 文件;

    例如:在我们写C程序时,它会默认包含了C标准库 /usr/lib/libc.a,里面有ANS1/ISO标准指定的函数,比如printf。所以我们不用再手动链接了;如果使用标准指定的函数以外的函数,这时我们要手动链接上相关的库了,如数学静态库 libm.a (头文件为 math.h)

    ar 的命令:

    以后补充;

                                     /****/

     

    举例:下面写一个 libhello.a 的静态库,然后通过 main.c函数调用;

    编写 hello.h,      目的为了让用户知道我们的动态库中有哪些接口可用。

    #ifndef __HELLO_H__
    #define __HELLO_H__
    void hello();
    
    #endif

    编写 hello.c

    #include <stdio.h>
    #include "hello.h"
    
    void hello() {                                                                  
            printf("hello, world
    ");
    }

    生成 hello.o 目标文件

    gcc -o hello.o -c hello.c

    生成 libhello.a 静态库

    ar -cqs libhello.a hello.o

    编辑 main.c文件

    #include "hello.h"
    
    int main(int argc, char** argv) {
        hello();
        return 0;
    }

    现在使用静态库把 main.c 生成最后的可执行代码:

    gcc –o Out main.c –L ./ –l hello

    注意:上面中的 –L :追加目录到库文件的搜索路径中; –l  :指定使用的库文件,其中的库名 将前缀lib和后缀.a(或.so)省略。

    运行代码,查看结果:

    ./ Out
    hello,world!

    动态库:

    文件名形如 libxxx.so,其中so是 Shared Object 的缩写,即可以共享的目标文件。

    生成动态库常用 gcc 命令;

    举例:

    编写头文件:ok.h 文件

    #ifndef __OK_H__
    #define __OK_H__
    
    void ok();
    
    #endif

    编写 ok.c 文件

    #include "ok.h"
    
    int main(int argc, char** argv) {
        ok();
        return 0;
    }

    生成动态库

    gcc –fPIC –shared –o libok.so ok.c

    编写 test.c 测试文件

    #include "ok.h"
    
    int main(int argc, char argv**) {
        ok();
        return 0;
    }

    利用动态库生成可执行文件;

    gcc -o Out test.c -L ./ –l ok

    注意:上面中的 –L :追加目录到库文件的搜索路径中; –l  :指定使用的库文件,其中的库名 将前缀lib和后缀.a(或.so)省略。

    现在运行:Out 可执行文件;

    yinheyi@ubuntu:~/play$ ./Out
    ./Out: error while loading shared libraries: libok.so: cannot open shared object file: No such file or directory

    先解决存在问题:这个Out 运行时,它的库的搜索路经不包括当前目录吧(上面用-L 追加的目录只用于生成Out文件的,和运行时没有关系),所以呢,

    1. 我们可以把 libok.so 库文件放到搜索目录中去:/usr/lib 或 /lib;

    2.也可以临时添加当前搜索路经:

    export LD_LIBRARY_PATH=`pwd`

    3. 配置文件/etc/ld.so.conf中指定的动态库搜索路径;动态装入器将在其中查找共享库。注意: /etc/ld.so.conf 中并不必包含 /lib/usr/lib,因为ldconfig程序会自动搜索这两个目录。

    • 1)把库路经放入 /etc/ld.so.conf文件中;
    • 2)运行ldconfig 生成最新的 /etc/ld.so.cache 文件;

     

    本文采用方法二以后再次运行,成功:

    yinheyi@ubuntu:~/play$ ./Out 
    Are you OK??
  • 相关阅读:
    Quartz学习——Spring和Quartz集成详解(三)
    Quartz学习——Quartz简单入门Demo(二)
    Quartz学习——Quartz大致介绍(一)
    Quartz学习——SSMM(Spring+SpringMVC+Mybatis+Mysql)和Quartz集成详解(四)
    使用spring+quartz配置多个定时任务
    quartz定时任务时间设置
    Hibernate事务与并发问题处理(乐观锁与悲观锁)
    Oracle体系结构之参数文件管理
    Oracle体系结构之密码文件管理
    LINUX RHEL AS 4 + ORACLE10G安装详解
  • 原文地址:https://www.cnblogs.com/yinheyi/p/6655353.html
Copyright © 2020-2023  润新知