首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt:比较QVariable与DLL的Enum

Qt:比较QVariable与DLL的Enum
EN

Stack Overflow用户
提问于 2020-02-04 17:42:24
回答 2查看 304关注 0票数 0

在测试函数中,我尝试将QVariable的QSignalSpy与Enum进行比较。我找到了Q_ENUM_NS,但是我找到了一个链接错误。我已经重建了它并运行了qmake。

错误消息:Undefined reference to CCS::staticMetaObject

testopcua.cpp (大部分部件)

代码语言:javascript
复制
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();
}

DLL的enums.h

代码语言:javascript
复制
#include <QObject>

namespace CCS
{
    Q_NAMESPACE

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

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-05 16:41:26

我认为您需要向QT_NAMESPACE宏添加一个显式的导出/导入指令。

代码语言:javascript
复制
namespace CCS
{
    Q_DECL_EXPORT Q_NAMESPACE

    ...
}

但是您很可能需要对Q_DECL_EXPORT部分进行抽象,以便在合适的情况下它是一个Q_DECL_IMPORT,如创建共享图书馆 (或Qt 如何用Qt创建一个库..。)中所描述的那样

DLL的global.h

代码语言:javascript
复制
#include <QtCore/QtGlobal>

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

DLL的enums.h

代码语言:javascript
复制
#include "global.h"
#include <QObject>

namespace CCS
{
    MYSHAREDLIB_EXPORT Q_NAMESPACE

    ...
}

请注意,如果您还计划使用"DLL“代码作为静态链接库(或直接包含在其他代码中,w/out任意库中),那么您将需要global.h中的第三个条件,它将MYSHAREDLIB_EXPORT定义为nothing。

DLL的global.h

代码语言:javascript
复制
#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)

不应该需要这个。

票数 1
EN

Stack Overflow用户

发布于 2021-02-11 14:08:56

从QT5.14开始,您可以使用Q_NAMESPACE_EXPORT宏。导出

代码语言:javascript
复制
namespace CSS
{
    Q_NAMESPACE_EXPORT(MYSHAREDLIB_LIBRARY)
    
    ...
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60062847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档