在测试函数中,我尝试将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();
}DLL的enums.h
#include <QObject>
namespace CCS
{
Q_NAMESPACE
enum class DataManagerState
{None, Configure, Ready, Active, Waiting, Stop};
Q_ENUM_NS(DataManagerState)
}发布于 2020-02-05 16:41:26
我认为您需要向QT_NAMESPACE宏添加一个显式的导出/导入指令。
namespace CCS
{
Q_DECL_EXPORT Q_NAMESPACE
...
}但是您很可能需要对Q_DECL_EXPORT部分进行抽象,以便在合适的情况下它是一个Q_DECL_IMPORT,如创建共享图书馆 (或Qt 如何用Qt创建一个库..。)中所描述的那样
DLL的global.h
#include <QtCore/QtGlobal>
#if defined(MYSHAREDLIB_LIBRARY)
# define MYSHAREDLIB_EXPORT Q_DECL_EXPORT
#else
# define MYSHAREDLIB_EXPORT Q_DECL_IMPORT
#endifDLL的enums.h
#include "global.h"
#include <QObject>
namespace CCS
{
MYSHAREDLIB_EXPORT Q_NAMESPACE
...
}请注意,如果您还计划使用"DLL“代码作为静态链接库(或直接包含在其他代码中,w/out任意库中),那么您将需要global.h中的第三个条件,它将MYSHAREDLIB_EXPORT定义为nothing。
DLL的global.h
#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
#endifQ_DECLARE_METATYPE(CCS::DataManagerState)
不应该需要这个。
发布于 2021-02-11 14:08:56
从QT5.14开始,您可以使用Q_NAMESPACE_EXPORT宏。导出
namespace CSS
{
Q_NAMESPACE_EXPORT(MYSHAREDLIB_LIBRARY)
...
}https://stackoverflow.com/questions/60062847
复制相似问题