同一个程序的静态堆栈空间(static、全局变量所存放的位置)只有一个,所以我们可以利用这块空间进行不同so中的操作。比如,一个so负责声明,另一个so负责实现,而且不需要直接相互包含。
下面给出一个例子,我会给出文件目录、所有文件内容以及编译脚本。其中clang++可以换成g++,版本需要支持c++17。
目录结构
-- helloworld
-- libFuncImpl
-- FuncImpl.h
-- FuncImpl.cpp
-- libFuncDecl
-- FuncDecl.h
-- FuncDecl.cpp
-- helloworld.cpp
-- message.h
-- build.sh
-- run.sh
libFuncImpl
两个文件写一起了,自己拆一下。
// FuncImpl.h
class FuncImpl {
public:
int Add(int a, int b);
void Print(int value);
};
// FuncImpl.cpp
#include "FuncImpl.h"
#include "message.h"
int FuncImpl::Add(int a, int b) {
auto func = Messager::get_server_func<int(int, int)>("add");
if (func)
return func(4,5);
return 0;
}
void FuncImpl::Print(int value) {
Messager::publish<int>("print", value);
}
libFuncDecl
// FuncDecl.h
class FuncDecl {
public:
void init();
};
// FuncDecl.cpp
#include "FuncDecl.h"