【问题标题】:Including a cpp file in a header file without multiple definition在没有多重定义的头文件中包含一个cpp文件
【发布时间】: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


【解决方案1】:

该类的定义在ovpncli.hpp 而不是ovpncli.cpp。 (Yes, really) 所以只需按照预期的方式使用标题系统即可。

#include "ovpncli.hpp"

并与ovpncli.cpp 链接,但不要#include 它。

【讨论】:

  • 根据github.com/OpenVPN/openvpn3/issues/48#issuecomment-398754706,“您必须使用ovpncli.cpp”。我也试过这个,只是得到了更多的错误。
  • @Chase 我敢打赌你有“未定义的引用/未解析的外部符号”错误,而不是查找适当的问题,而是创建了这个基本上是 XY 问题的问题。请注意,“必须使用 ovpncli.cpp”并不意味着“必须包含 ovpncli.cpp”
  • @Chase:您链接到的另一个用户缺少 and link with ovpncli.cpp 步骤。它们包含 ovpncli.hpp 作为标题,并且对 ovpncli.cpp 完全没有任何作用
  • @Chase 您链接的线程没有编译错误。 This is a linking error 虽然链接器输入列表隐藏在不包含在 pastebin 中的 *.jom 文件中,但我 100% 确定问题是无法将 ovpncli.cpp 编译为单独的单元,然后通过 ovpncli。 obj 到链接器。
  • @Chase:在#include "ovpncli.hpp"之前尝试#include <openvpn/common/exception.hpp>
猜你喜欢
  • 2020-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-20
  • 1970-01-01
  • 2012-04-15
相关资源
最近更新 更多