makefile 编译动态链接库使用(.so库文件)
动态链接库:不会把代码编译到二进制文件中,而是在运行时才去加载, 好处是程序可以和库文件分离,可以分别发版,然后库文件可以被多处共享
动态链接库
动态:动态加载
链接:二进制文件和库文件分离。
库 库文件 .so
新建一个文件TestSo
//
// Created by qiufh on 2024-01-21.
//#ifndef UNTITLED3_TESTSO_H
#define UNTITLED3_TESTSO_Hclass 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\n");
}
void TestSo::fun2() {printf("fun2\n");
}
void TestSo::fun3() {printf("fun3\n");
}
编译一下
main.cpp
#include <iostream>
#include "TestSo.h"
class Test:public TestSo{
public:void fun2() {printf("fun2\n");}void fun3() {printf("fun3\n");}
};
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\n");}void fun3() {printf("fun3\n");}
};
int main() {Test test;test.fun1();test.fun2();test.fun3();return 0;
}
链接动态库文件,执行测试一下,没问题,输出打印信息。
将cpp文件与so文件链接并生成执行文件:先将so文件拷贝至/lib文件夹内:
否则将会出现下面的错误:
把这个动态库的编译流程写入makefile文件中
先clean一下
再make一下
然后要把so文件拷贝到/lib目录下,否则会报错
成功