makefile 编译动态链接库使用(.so库文件)

makefile 编译动态链接库使用(.so库文件)

动态链接库:不会把代码编译到二进制文件中,而是在运行时才去加载, 好处是程序可以和库文件分离,可以分别发版,然后库文件可以被多处共享

动态链接库

动态:动态加载

链接:二进制文件和库文件分离。

库 库文件 .so

新建一个文件TestSo

//
// Created by qiufh on 2024-01-21.
//

#ifndef UNTITLED3_TESTSO_H
#define UNTITLED3_TESTSO_H


class TestSo {
public:
    void fun1();

    virtual void fun2();

    virtual void fun3() = 0;
};
//
// Created by qiufh on 2024-01-21.
//

#include "TestSo.h"
#include <iostream>
void TestSo::fun1() {
    printf("fun1
");
}
void TestSo::fun2() {
    printf("fun2
");
}
void TestSo::fun3() {
    printf("fun3
");
}

在这里插入图片描述

编译一下

在这里插入图片描述

main.cpp

#include <iostream>
#include "TestSo.h"
class Test:public TestSo{
public:
    void fun2() {
        printf("fun2
");
    }
    void fun3() {
        printf("fun3
");
    }
};
int main() {
    Test test;
    test.fun1();
    test.fun2();
    test.fun3();
    std::cout << "Hello, World!" << std::endl;
    return 0;
}

写好之后我们放到linux系统中验证

在这里插入图片描述

编译成动态库.so文件

在这里插入图片描述

新建一个test.cpp测试文件

#include <iostream>
#include "SoTest.h"
class Test:public SoTest{
public:
    void fun2() {
        printf("fun2
");
    }
    void fun3() {
        printf("fun3
");
    }
};
int main() {
    Test test;
    test.fun1();
    test.fun2();
    test.fun3();
    return 0;
}

链接动态库文件,执行测试一下,没问题,输出打印信息。

在这里插入图片描述

将cpp文件与so文件链接并生成执行文件:先将so文件拷贝至/lib文件夹内:

在这里插入图片描述

否则将会出现下面的错误:

在这里插入图片描述

把这个动态库的编译流程写入makefile文件中

在这里插入图片描述

先clean一下

在这里插入图片描述

再make一下

在这里插入图片描述

然后要把so文件拷贝到/lib目录下,否则会报错

在这里插入图片描述

成功

在这里插入图片描述