欢迎光临
我们一直在努力

Linux中如何使用动态库和静态库

  • 为什么引入库
  • 在上述案例中,主程序要是有的源程序代码,在add.cpp中,如果项目结束后,到了交付阶段,由于主程序的生成需要其他程序联合编译,那么就要将源程序打包一起发给老板,这样该程序的开发者自身的价值就不大了,该项目的知识产权就很容易被窃取。为了保护我们的知识产权,我们引入了库的概念。

      2.什么是库

    库在linux中是一个二进制文件,它是由 .cpp文件(不包含main函数)编译而来,其他程序如果想要使用该源文件中的函数时,只需在编译生成可执行程序时,链接上该源文件生成的库文件即可。库中存储的是二进制文件,不容易被窃取知识产权,做到了保护作用。

    库在linux系统中分为两类,分别是静态库和动态库    windows

          ***.lib:静态库       ***.dll:  动态库    linux

          ***.a:静态库

          ***.so: 动态库

     3.静态库及其制作

    概念:将一个***.cpp的文件编译生成一个 lib***.a的二进制文件,当你需要使用该源文件中的函数时,
    只需要链接该库即可,后期可以直接调用
    静态体现在:在使用g++编译程序时,会将你的文件和库最终生成一个可执行程序(把静态库也放入到可执行
    程序中),每个可执行程序单独拥有一个静态库,体积较大,但是,执行效率较高

            3.1 准备程序

            1. add.h(头文件)

    #ifndef _ADD_H_ // 防止头文件重复包含
    #define _ADD_H_

    int add(int m, int n); // 函数声明

    #endif

            2. add.cpp(函数实现文件)

    #include "add.h" // 包含头文件(可选,但建议加,保证声明和实现一致)

    int add(int m, int n)
    {
    return m + n;
    }

    3. main.cpp(主程序文件)

    #include<iostream>
    #include<stdio.h>
    #include "add.h" // 包含自定义头文件
    using namespace std;

    int main(int argc, const char* argv[])
    {
    cout << add(3,8) << endl; // 调用外部文件中的add函数
    return 0;
    }

    3.2 编译生成静态库

    gcc -c ***.cpp -o ***.o
    ar -crs lib***.a ***.o

    //调用外部文件中的相关函数
    //只编译不链接生成二进制文件
    //编译生成静态库

    如果有多个.o文件共同编译生成静态库 :ar -crs lib***.a ***.o xxx.o …

    ar:用于生成静态库的指令
    c:用于创建静态库
    r:将文件插入或者替换静态库中同名文件
    s:重置金泰克索引

    3.3 使用静态库

    gcc main.cpp -L 库的路径 -l库名 -I 头文件的名字

    4、动态库及其制作

    概念:将一个***.cpp的文件编译生成一个 lib***.so的二进制文件,当你需要使用该源文件中的函数时,
    只需要链接该库即可,后期可以直接调用
    动态体现在:在使用g++编译程序时,会将你的文件和库中的相关函数的索引表一起生成一个可执行程序,每
    个可执行程序只拥有函数的索引表,当程序执行到对应函数时,会根据索引表,动态寻找相关库所在位置进行
    调用,体积较小,执行效率较低,但是可以多个程序共享同一个动态库,所以,动态库也叫共享库

    4.1 准备程序

    add.h

    #ifndef _ADD_H_
    #define _ADD_H_
    int add(int m, int n);
    #endif

    add.cpp

    int add(int m, int n)
    {
    return m+n;
    }

    main.cpp

    #include<iostream>
    #include<stdio.h>
    #include "add.h"
    using namespace std;
    int main(int argc, const char *argv[])
    {
    cout << add(3,8) << endl;
    return 0;
    }

    4.2 编译生成动态库

    g++ -fPIC -c ***.cpp -o ***.o
    g++ -shared ***.o -o lib***.so
    上述两个指令可以合成一个指令
    //调用外部文件中的相关函数
    //编译生成二进制文件
    //依赖于二进制文件生成一个动态库
    g++ -fPIC -shared ***.cpp -o lib***.so

    4.3 使用动态库

    gcc main.cpp -L 库的路径 -l库名 -I 头文件的名字

    4.4 以上错误的解决方式

    方式1:更改路径的宏

    export LD_LIBRARY_PATH=库的路径

    方法2:将自己的动态库放入到系统的库函数目录中 (/lib64 /usr/lib64)

    5、动态库和静态库编译生成可执行程序的大小比较、

    赞(0)
    未经允许不得转载:171主机测评 » Linux中如何使用动态库和静态库
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址