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目录下,否则会报错
成功