Qt和Q_OBJECT

时间:2018-01-07 17:52:13

标签: c++ linux qt ld-preload

这是我的代码:

的Tools.h

#include <QtCore/QObject>    
namespace Tinject
{
    class ProbeCreator : public QObject
    {
        Q_OBJECT

        public:
            explicit ProbeCreator();
            Q_INVOKABLE void createProbe();
            //void update();
    };
}

tools.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(); 
}

这有什么问题?

代码太多,额外测试:)

2 个答案:

答案 0 :(得分:1)

看起来您的tools.cpp未包含在源代码中或未编译。

答案 1 :(得分:1)

  

#include "tools.h"

这是错的;你需要包括标题:

tools.cpp

此外,正如@StPiere指出的那样,您需要将源文件moc_*.cpp 生成的g++文件包含在链接中。如何通过自定义调用moc来完成此操作,您将尝试自己;但我建议使用qmake并设置一个项目文件,该文件也会处理graphEditorInputMode.orthogonalEdgeEditingContext = new yfiles.input.OrthogonalEdgeEditingContext();和许多其他Qt特定细节。