首页 > 解决方案 > 共享对象取决于代码中的符号动态链接它吗?

问题描述

我有一个共享对象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时,它会调用应用程序提供的方法来动态链接它。这可能吗?通常,应用程序依赖于共享对象提供的符号,但是是否可以让共享对象依赖于动态加载它的二进制文件中的符号?

标签: c++linuxshared-libraries

解决方案


动态链接是一种方式,从库的用户 → 到库。

从库到用户的回调通常通过函数指针完成:

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++ 虚函数机制。我只是展示主要思想。


推荐阅读