【发布时间】:2019-05-20 17:42:48
【问题描述】:
我必须使用C++ OpenVPN3 library 来开发具有 OpenVPN 功能的 Qt 应用程序。问题是我需要创建一个从 QObject 和这个库提供的抽象类派生的类。
class Client : public QObject, public ClientAPI::OpenVPNClient {
Q_OBJECT
{
. . .
}
我需要使用的所有类型都保存在一个名为 ovpncli.cpp 的大源 (cpp) 文件中。当我现在在头文件中包含源文件时,这会成为问题,因为当编译器生成翻译单元时,它会导致多重定义错误。从 QObject 继承的类也必须有单独的定义和实现,除非您在末尾添加“include myclass.moc”(但这对我来说不起作用here)。库开发人员除了“只将 OpenVPN 头文件放在我的类的实现文件中”之外没有说太多,但这是不可能的,因为类定义是从仅在 `ovpnfile 中定义的类继承的。
有没有办法可以在头文件中包含一个 cpp 文件,同时防止多重定义错误?
【问题讨论】:
-
无需在任何地方包含 .cpp。您应该改用相应的
ovpncli.hpp文件。 -
@VTT 请参考我在 Ben 的回答中留下的评论。我会想到同样的事情,但它不起作用,根据其中一位维护者的说法,您必须使用 .cpp 文件。
-
@drescherjm 我是打开这个问题的人,坦率地说,他们没有说我不知道的内容,这就是我在这里的原因。 OpenVPN 标头不能完全从我的类的头文件中排除,否则它不能从 ClientAPI::OpenVPNClient 继承。
-
如果你无法绕过这个糟糕的设计,你可能不得不切换到组合而不是继承。
标签: c++ qt compiler-errors openvpn