Включение файла cpp в заголовочный файл без многократного определения - PullRequest
1 голос
/ 20 мая 2019

Я должен использовать библиотеку C ++ OpenVPN3 для разработки приложения Qt с возможностями OpenVPN.Проблема заключается в том, что мне нужно создать класс, производный как от QObject, так и от абстрактного класса, предоставляемого этой библиотекой.

class Client : public QObject, public ClientAPI::OpenVPNClient {
    Q_OBJECT
{
 . . .
}

Все типы, которые мне нужно использовать, хранятся в одном большом источнике (cpp)файл называется ovpncli.cpp.Это становится проблематичным, когда я теперь включаю исходный файл в заголовочный файл, потому что это вызывает ошибку множественного определения, когда единицы перевода генерируются компилятором.Классы, которые наследуются от QObject, также должны иметь отдельное определение и реализацию, если вы не добавите «include myclass.moc» до конца (но это не сработало для меня, как видно здесь ).Разработчики библиотеки не сказали ничего, кроме «помещения заголовочных файлов OpenVPN только в файл реализации моего класса», но это невозможно, поскольку определение класса наследуется от класса, определенного только в файле «ovpnfile».

Isесть ли способ включить файл cpp в заголовочный файл, одновременно предотвращая ошибку множественного определения?

1 Ответ

3 голосов
/ 20 мая 2019

Определение этого класса в ovpncli.hpp, а не ovpncli.cpp. ( Да, действительно ) Так что просто используйте систему заголовков так, как она была задумана.

#include "ovpncli.hpp"

и ссылка с ovpncli.cpp, но не #include it.

...