Qt: Сравните QVariable с Enum из DLL - PullRequest
0 голосов
/ 04 февраля 2020

Я пытаюсь сравнить QVariable QSignalSpy с Enum в тестовой функции. Я нашел Q_ENUM_NS, но получил ошибку компоновщика. Я восстановил его и запустил qmake.

Сообщение об ошибке: Undefined reference to CCS::staticMetaObject

testopcua. cpp (большинство частей)

Q_DECLARE_METATYPE(CCS::DataManagerState)

using namespace ::testing;
class TestOpcUa : public Test
{
public:
    TestOpcUa()
    {
        //.....
    }

    ~TestOpcUa()
    {
        delete _selectedConfValid;
        delete _opcUaObjectValid;
    }

protected:
    MockOpcConf* _selectedConfValid = nullptr;
    OpcUa* _opcUaObjectValid = nullptr;
};

TEST_F(TestOpcUa, checkHandshake)
{
    qRegisterMetaType<CCS::DataManagerState>("state");
    QSignalSpy readySpy(_opcUaObjectValid, SIGNAL(newManagerState(CCS::DataManagerState)));
    _opcUaObjectValid->connect();
    readySpy.wait();
    ASSERT_EQ(readySpy.count(), 1);
    ASSERT_EQ(readySpy.at(0).at(0).value<CCS::DataManagerState>(), CCS::DataManagerState::Ready); //Linker error
}

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
    testing::InitGoogleTest(&argc, argv);
    testing::InitGoogleMock(&argc, argv);
    return RUN_ALL_TESTS();
}

enums.h DLL

#include <QObject>

namespace CCS
{
    Q_NAMESPACE

    enum class DataManagerState
    {None, Configure, Ready, Active, Waiting, Stop};
    Q_ENUM_NS(DataManagerState)
}

1 Ответ

0 голосов
/ 05 февраля 2020

Я думаю, вам нужно добавить явную директиву экспорта / импорта в макрос QT_NAMESPACE.

namespace CCS
{
    Q_DECL_EXPORT Q_NAMESPACE

    ...
}

Но вам, скорее всего, потребуется абстрагировать часть Q_DECL_EXPORT, чтобы она была Q_DECL_IMPORT при правильных обстоятельствах, как описано в Создание общих библиотек (или в Qt Wiki Как создать библиотеку с Qt ... )

global.h DLL

#include <QtCore/QtGlobal>

#if defined(MYSHAREDLIB_LIBRARY)
#  define MYSHAREDLIB_EXPORT Q_DECL_EXPORT
#else
#  define MYSHAREDLIB_EXPORT Q_DECL_IMPORT
#endif

enums.h из DLL

#include "global.h"
#include <QObject>

namespace CCS
{
    MYSHAREDLIB_EXPORT Q_NAMESPACE

    ...
}

Обратите внимание, что если вы планируете также использовать код "DLL" в качестве статически связанной библиотеки (или напрямую включенной в другой код, w / из любой библиотеки) вам понадобится 3-е условие в global.h, которое определяет MYSHAREDLIB_EXPORT как ничто.

global.h DLL

#include <QtCore/QtGlobal>

#if defined(MYSHAREDLIB_LIBRARY)
#  define MYSHAREDLIB_EXPORT Q_DECL_EXPORT
#elif defined(MYSHAREDLIB_STATIC)
#  define MYSHAREDLIB_EXPORT
#else
#  define MYSHAREDLIB_EXPORT Q_DECL_IMPORT
#endif

Q_DECLARE_METATYPE (CCS :: DataManagerState)

Это не нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...