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;
};
在您的库的源文件中,您将包含 A 和 B 的头文件,并创建接口以及工厂的定义。
class Implementation : public Interface {
//...
};
std::unique_ptr<Interface>
Interface::make () {
return std::make_unique<Implementation>();
}
因此,您库的用户可以访问该接口,并且可以在不了解私有成员或私有方法的情况下调用 public 方法。
我正在尝试用 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 的类型。目前我发现的最接近的是
编辑: 根据要求,解释代码。
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;
};
在您的库的源文件中,您将包含 A 和 B 的头文件,并创建接口以及工厂的定义。
class Implementation : public Interface {
//...
};
std::unique_ptr<Interface>
Interface::make () {
return std::make_unique<Implementation>();
}
因此,您库的用户可以访问该接口,并且可以在不了解私有成员或私有方法的情况下调用 public 方法。