美文网首页
c++静态库和动态库

c++静态库和动态库

作者: arkliu | 来源:发表于2022-11-05 16:42 被阅读0次

    测试类的准备

    先新建几个类来测试静态库和动态库的生成和使用
    lib_a.h

    #ifndef LIB_A_H
    #define LIB_A_H
    
    #include <iostream>
    using namespace std;
    
    void myPrint();   // 自定义函数的声明
    #endif
    

    lib_a.cpp

    #include "lib_a.h"
    
    void myPrint() {
        cout <<"大家好,我叫张三"<<endl;
        //cout <<"我爱北京天安门"<<endl;
        //cout <<"保护环境人人有责"<<endl;
    }
    

    lib_a_test.cpp

    #include "lib_a.h"
    
    int main() {
        myPrint();
    }
    
    image.png

    静态库

    静态库在编译的时候,主程序会把静态库编译进去,这样做的优点是,编译完成后,生成的可执行文件可以脱离静态库独立运行, 缺点是,静态库的文件每次改动,都要重新编译主程序

    静态库文件名的命名方式是“libxxx.a”,库名前加”lib”,后缀用”.a”,“xxx”为静态库名

    静态库的制作

    g++ -c -o libtest.a lib_a.cpp
    
    image.png

    使用静态库

    • 直接使用
    g++ -o myPrint lib_a_test.cpp libtest.a
    
    image.png
    • 使用L参数指定静态库文件的目录,-l参数指定静态库名
    g++ -o myPrint lib_a_test.cpp -L/home/lh/code/lib_a -ltest
    
    image.png

    注意:

    • 如果要指定多个静态库文件的目录,用法是“-L/目录1 -L目录2 -L目录3”
    • 链接库的文件名是libpublic.a,但链接库名是”public”,不是“libpublic.a”
    • 如果要指定多个静态库,用法是“-l库名1 -l库名2 -l库名3”。

    动态库

    动态库在编译时并不会被连接到目标代码中,而是在程序运行时才被载入,因此在程序运行时还需要指定动态库的目录。

    动态库的命名方式与静态库类似,前缀相同,为“lib”,后缀变为“.so” “xxx”为动态库名。

    生成动态库

    g++ -fPIC -shared -o libtest.so lib_a.cpp
    

    使用动态库

    \color{red}{使用动态库的方法与使用静态库的方法相同, 如果在动态库文件和静态库文件同时存在,优先使用动态库编译}

    g++ -o myPrint lib_a_test.cpp -L/home/lh/code/lib_a -ltest
    
    image.png

    报错:./myPrint: error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory
    这是因为采用了动态链接库的可执行程序在运行时需要指定动态库文件的目录,Linux系统中采用LD_LIBRARY_PATH环境变量指定动态库文件的目录

    export LD_LIBRARY_PATH=/home/lh/code/lib_a
    
    image.png

    相关文章

      网友评论

          本文标题:c++静态库和动态库

          本文链接:https://www.haomeiwen.com/subject/jaxctdtx.html