c++ - 共享对象取决于代码中的符号动态链接它吗?
问题描述
我有一个共享对象my_lib.cc
,它在其标头中定义了一个类和一个工厂函数:
extern Foo* GetFoo():
class Foo {
public:
Foo() {}
virtual ~Foo() {}
};
现在我希望使用库的应用程序main.cc
包含:
#include "my_lib.h"
class Bar : public Foo {
// ...
};
Foo* GetFoo() {
return new Bar();
}
关键是当共享对象内部的代码需要创建一个Foo
时,它会调用应用程序提供的方法来动态链接它。这可能吗?通常,应用程序依赖于共享对象提供的符号,但是是否可以让共享对象依赖于动态加载它的二进制文件中的符号?
解决方案
动态链接是一种方式,从库的用户 → 到库。
从库到用户的回调通常通过函数指针完成:
在my_lib.cc
:
Foo* (*MakeFoo)();
void setFooFactory(Foo* (*pMakeFoo)()) {
MakeFoo = pMakeFoo;
}
然后在main.cc
:
Foo* MakeBar() {
return new Bar();
}
int main() {
// load my_lib ...
setFooFactory(MakeBar);
// . . .
}
您还可以包装MakeFoo()
成工厂class
并使用 C++ 虚函数机制。我只是展示主要思想。
推荐阅读
- docker - 无法使用 Docker 运行 Strapi
- arrays - 是否有一些特定的方法可以访问 C 多维数组中的字符串?
- javascript - 如何使用 Redux-Toolkit 重置 Redux Store
- ios - 使用 Transporter.app 将 .ipa 上传到 App Store 时 Expo App 的包标识符不正确
- sql - 从sql中的字符串中检索行号和列号
- oracle - PL/SQL 创建检查表中是否有记录的触发器
- mysql - 我如何找到每天的最后价格?
- angular - 使用 Angular + Firestore (firebase) 搜索按钮(不是即时搜索)
- python - 获取频道/聊天实体
- c# - C# Roslyn .NET CORE 3.1 CSharpCompilation 动态 RuntimeBinder.Binder.Convert 错误