Qt 和 Q_OBJECT
Posted
技术标签:
【中文标题】Qt 和 Q_OBJECT【英文标题】:Qt and Q_OBJECT 【发布时间】:2018-01-07 17:52:12 【问题描述】:这是我的代码:
工具.h
#include <QtCore/QObject>
namespace Tinject
class ProbeCreator : public QObject
Q_OBJECT
public:
explicit ProbeCreator();
Q_INVOKABLE void createProbe();
//void update();
;
工具.cpp
#include <stdio.h>
#include "tools.h"
#include <QtCore/QCoreApplication>
#include <QtCore/QMetaObject>
using namespace std;
using namespace Tinject;
ProbeCreator::ProbeCreator()
moveToThread(QCoreApplication::instance()->thread());
QMetaObject::invokeMethod(this, "createProbe", Qt::QueuedConnection);
void ProbeCreator::createProbe()
printf("CREATE PROBE");
#include "tools.moc"
在每个之前
g++ (g++ -fPIC -o hook.so -shared -I/path/Qt5.4.2/5.4/gcc_64/include -L/path/Qt5.4.2/5.4/gcc_64/lib -lQt5Core main.cpp)
我在跑步
moc tools.h -o tools.cpp
然后我尝试注入这个库钩子。所以我使用LD_PRELOAD
,我得到了以下错误:
hook.so:未定义符号:_ZN12ProbeCreatorC1Ev
我的 main.cpp 是:
#include "tools.cpp"
using namespace Tinject;
extern "C" Q_DECL_EXPORT
void qt_startup_hook()
new ProbeCreator();
这有什么问题?
代码太多,额外测试:)
【问题讨论】:
这是一个链接器错误。看起来缺少库或库版本错误。 我知道,但我如何检查哪里出了问题? :) 我会首先检查 ProbeCreator 的定义位置,是否链接了包含其定义的库,如果是,请尝试使用相同的编译器设置重新编译这些库。 我将 main.cpp 从评论部分转移到主要问题。 【参考方案1】:您的 tools.cpp 似乎未包含在源代码中或未编译。
【讨论】:
【参考方案2】:
#include "tools.cpp"
这是错误的;您需要包含标题:
#include "tools.h"
此外,正如@StPiere 指出的那样,您需要将源文件tools.cpp
和生成的moc_*.cpp
文件包含到链接中。您如何通过对g++
的自定义调用来做到这一点,您将自己尝试;但是我建议使用qmake
并设置一个项目文件,该文件还将处理moc
ing 和许多其他Qt 特定细节。
【讨论】:
以上是关于Qt 和 Q_OBJECT的主要内容,如果未能解决你的问题,请参考以下文章
QT和VS的关系??? 嘿嘿新手一只~ 请问1.QT和VS的关系是??? 2.QT Creator 和QT SDK有啥区别? 谢谢~