【问题标题】:Qt and Q_OBJECTQt 和 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 从评论部分转移到主要问题。

标签: c++ linux qt ld-preload


【解决方案1】:

您的 tools.cpp 似乎未包含在源代码中或未编译。

【讨论】:

    【解决方案2】:

    #include "tools.cpp"

    这是错误的;您需要包含标题:

    #include "tools.h" 
    

    此外,正如@StPiere 指出的那样,您需要将源文件tools.cpp 生成的moc_*.cpp 文件包含到链接中。您如何通过对g++ 的自定义调用来做到这一点,您将自己尝试;但是我建议使用qmake 并设置一个项目文件,该文件还将处理mocing 和许多其他Qt 特定细节。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-24
      • 1970-01-01
      相关资源
      最近更新 更多