public api 隐藏依赖库的 C++ 动态库

C++ dynamic library with public api that obscures dependent libraries

我正在尝试用 C++ 创建一个 multi-platform 库以供 C++ 消费者应用程序使用。给我的图书馆打电话 A。我想为每个目标平台发送一个动态库文件,以及一个消费者应用程序可以用来编译和执行的 header 文件(称之为 export.h)。我的库依赖于一个 third-party open-source 库,用 c 编写,很难 link 正确;调用这个库 B.

为了让我的消费者免于 linking 到 B 的痛苦,我想抽象对它的每次调用,这样消费者甚至不需要来自 B 的单个 header 文件。消费者应用程序 (C) 应该只能使用 A.dll、B.dll 和 export.h 进行编译;和 运行 只有 A.dll 和 B.dll 作为依赖项(根据需要用 platform-specific 后缀替换共享库)。

B 定义了很多类型,主要是结构体。 (B 没有写在 objective c 中,尽管它可能应该是。)A 的部分工作是生成 classes,其中包含和管理逻辑行周围的结构组,这很明显。 C 需要调用 A 中属于 classes 的函数,所以函数原型需要在 export.h 中,但是 B 类型不能在 export.h 中,否则 C 需要包含 header来自 B.

是否有一种语法可以让我定义 class(在 A 中)的 public 成员而不同时定义所有私有成员?

显然,A 中没有 public 成员依赖于 B 的类型。目前我发现的最接近的是 。不透明指针可能是解决方案的一部分,但 C 需要访问 A 中 classes 的函数。我真的不想为每个 public A class 成员编写辅助函数,尽管那可能会奏效。有什么想法吗?

编辑: 根据要求,解释代码。

Worker.h:

#include <SomeThirdPartyLib.h>
class Worker {
public:
  Worker();
  ~Worker();
  void DoWork();
private:
  Truck t;
}

SomeThirdPartyLib.h:

typedef struct TruckS {
  char data[200];
  char* location;
} Truck;

Worker.cpp:

#include "worker.h"
Worker::Worker() {}
Worker::~Worker() {}
Worker::DoWork() {
  t.location = "Work";
}

main.cpp:

#include <export.h>
int main(int argc, char** argv) {
  Worker w();
  w.DoWork();
}

现在我正在寻找要放入 export.h 的语法,它允许使用 header 和我的 dll 编译此外部应用程序,但不需要访问 SomeThirdPartyLib.h.

这里有一个可能接近您想要实现的技术。

您可以定义一个仅依赖于来自 A 的 public 接口的接口,因此不依赖于 B .接口 class 包括一个工厂。此接口将成为您的库的头文件的一部分。

class Interface {
public:

    virtual void foo () = 0;
    virtual void bar () = 0;

    static std::unique_ptr<Interface> make ();

    virtual ~Interface () = default;
};

在您的库的源文件中,您将包含 AB 的头文件,并创建接口以及工厂的定义。

class Implementation : public Interface {
    //...
};

std::unique_ptr<Interface>
Interface::make () {
    return std::make_unique<Implementation>();
}

因此,您库的用户可以访问该接口,并且可以在不了解私有成员或私有方法的情况下调用 public 方法。

Try it online!