- 主题:dlopen的类怎么玩?
MyClass {
int open();
int read();
int close();
};
MyClass位于libx1中
主程序
MyClass c1;
c1.open();
c1.read();
c1.close();
需求
无论libx1是静态加载还是动态加载,主程序的代码不需要大改,最好是不改。
--
FROM 117.136.38.*
把动态库、库函数先用延迟求值的单例模式包装实现加载,然后用宏包一下做成原来的函数名就行。这个办法处理C接口的api最容易,类的话包装起来就可能麻烦多了。不过一般也不用dlopen直接处理类成员函数吧。
这种方法我在windows下写过,配合decltype可以避免包装类重复声明函数原型,只要有库名、函数名和标准c接口头文件就可以了。做成脚本可以自动化配置。
【 在 prc79 的大作中提到: 】
: MyClass {
: int open();
: int read();
: ...................
--
修改:milksea FROM 114.249.195.*
FROM 114.249.195.*
动态加载那不就是插件了?插件有固定套路,不用多想,想也没用。
静态加载可以直接导出类。
如果没有统一需求的话,可以把myclass搞成capi输出,外面重写头文件。
【 在 prc79 的大作中提到: 】
:
: MyClass {
: int open();
: int read();
: int close();
--
FROM 221.222.20.*
我感觉他是想动态加载静态加载都支持,不改变调用源代码。所以不单纯是伪COM那种搞法。
【 在 xieyf 的大作中提到: 】
: 动态加载那不就是插件了?插件有固定套路,不用多想,想也没用。
:
: 静态加载可以直接导出类。
: ...................
--
FROM 114.249.192.*
自己解决
nm -D libx1.so
0000000000000b86 T _ZN10CxxReader25open2EPKc
0000000000000bfc T _ZN10CxxReader25read2EiPvi
0000000000000bb2 T _ZN10CxxReader26close2Ei
handle = dlopen("libx1.so")
sym_addr_ZN10CxxReader25open2EPKc = dlsym(handle, "_ZN10CxxReader25open2EPKc");
sym_addr_ZN10CxxReader25read2EiPvi = dlsym(handle, "_ZN10CxxReader25read2EiPvi")
sym_addr_ZN10CxxReader26close2Ei = dlsym(handle, "_ZN10CxxReader26close2Ei")
a.S
_ZN10CxxReader25open2EPKc:
jmp dword ptr [sym_addr_ZN10CxxReader25open2EPKc]
_ZN10CxxReader25read2EiPvi:
jmp dword ptr [sym_addr_ZN10CxxReader25read2EiPvi]
_ZN10CxxReader26close2Ei:
jmp dword ptr [sym_addr_ZN10CxxReader26close2Ei]
【 在 prc79 的大作中提到: 】
: MyClass {
: int open();
: int read();
: ...................
--
FROM 117.136.0.*
【 在 milksea 的大作中提到: 】
: 我感觉他是想动态加载静态加载都支持,不改变调用源代码。所以不单纯是伪COM那种搞法。
其实com的方法挺好的,通用性强
--
FROM 111.206.145.*
参考TensorFlow的operator反射宏搞个插件库,动态静态都没问题,不喜欢宏的话也可以用CRTP
【 在 prc79 的大作中提到: 】
: MyClass {
: int open();
: int read();
: ...................
--
FROM 106.11.34.*