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 并设置一个项目文件,该文件还将处理mocing 和许多其他Qt 特定细节。

【讨论】:

以上是关于Qt 和 Q_OBJECT的主要内容,如果未能解决你的问题,请参考以下文章

QT和VS的关系??? 嘿嘿新手一只~ 请问1.QT和VS的关系是??? 2.QT Creator 和QT SDK有啥区别? 谢谢~

Qt OpenGL模块和Qt/3D有啥区别

QT 创建者和 Qt(只是它本身)的区别 - 启动 QT

Qt Creator 2.6.2 和 Qt 4.8.4:Qt 版本未正确安装

Qt 5.14和Qt Creator工具简介

qt信号和槽机制的问题