C++ QT应用程序链接(加载?)错误

C++ QT应用程序链接(加载?)错误,c++,qt,C++,Qt,编译使用图形库的基于QT的示例应用程序后,在尝试运行该应用程序时出现以下错误: ./basic_dyn ./basic_dyn: symbol lookup error: /qanava-0.4/lib/libqanava.so.0.4.0: undefined symbol: _ZNK18QAbstractListModel7siblingEiiRK11QModelIndex 在过去,我看到这些错误是由于未能链接到适当的库而导致的。因此,看到错误是如何来自图形库的,我快速检查了库中的名称:

编译使用图形库的基于QT的示例应用程序后,在尝试运行该应用程序时出现以下错误:

./basic_dyn 
./basic_dyn: symbol lookup error: /qanava-0.4/lib/libqanava.so.0.4.0: undefined symbol: _ZNK18QAbstractListModel7siblingEiiRK11QModelIndex
在过去,我看到这些错误是由于未能链接到适当的库而导致的。因此,看到错误是如何来自图形库的,我快速检查了库中的名称:

nm libqanava.so.0.4.0 | grep QAbstractListModel
    U _ZN18QAbstractListModel11qt_metacallEN11QMetaObject4CallEiPPv
    U _ZN18QAbstractListModel11qt_metacastEPKc
    [[ .... several list of output removed ....]]
    U _ZNK18QAbstractListModel6parentERK11QModelIndex
    U _ZNK18QAbstractListModel7siblingEiiRK11QModelIndex
    U _ZTI18QAbstractListModel
从中我们可以看出,库中确实存在有问题的函数(
\u znk18qabstractlistmodel7siblingiirk11qmodelindex
)。重复名称提取,这一次打开名称Demanling,给出

nm -C libqanava.so.0.4.0 | grep QAbstractListModel
    U QAbstractListModel::qt_metacall(QMetaObject::Call, int, void**)
    U QAbstractListModel::qt_metacast(char const*)
    [[ .... several lines removed .... ]]
    U QAbstractListModel::parent(QModelIndex const&) const
    U QAbstractListModel::sibling(int, int, QModelIndex const&) const
    U typeinfo for QAbstractListModel
因此,我们可以看到函数是
QAbstractListModel::sibling
。参考QT文档,该类似乎是Qt5Core库的一部分。事实上,通过查看Qt5Core导出的函数,我们发现:

nm -C libQt5Core.so.5.5.1 | grep QAbstractListModel
  0000000000503a40 r qt_meta_data_QAbstractListModel
     [[ .... many lines deleted .... ]]
  00000000002257c0 T QAbstractListModel::parent(QModelIndex const&) const
  00000000002257f0 T QAbstractListModel::sibling(int, int, QModelIndex const&) const
  000000000059f850 V typeinfo for QAbstractListModel
因此,Offering函数是从Qt5Core导出的。我希望这个符号能被定义

应用程序编译为,我们可以看到libQt5Core链接到:

g++ moc_canMainWindow.o canApp.o canMainWindow.o -L/usr/X11R6/lib -L/opt /qt5/lib 
-L../../lib -lQt5Gui -lQt5Xml -lQt5Core -lQt5Widgets -lqanava -lpng -lfreetype -lSM 
-lICE   -lXext -lX11  -lz -lm -pthread  -lrt -ldl -o basic_dyn
因此,相应的QT库在命令行上,我本以为这些符号已经被解析了。更改命令行上库的顺序(更改为
-lqanava-lQt5Gui-lQt5Xml-lQt5Core-lQt5Widgets
)对结果没有影响


据我所知,我很茫然,我希望符号能够被解析,应用程序能够运行。任何人对这里发生的事情都有一个解释,并有一个如何解决这个问题的建议>

很可能你不会太高兴,因为我不能给你一个简洁的答案,但我有完全相同的错误,事实上你的错误消息是我的搜索词(=未定义的符号:_znk18qabstractlistmodel7siblingiirk11qmodelindex)。我就是这样来到这里的。 因此,我的“解决方案”可能会提示您如何解决您的问题

在经历了大量乏味的跟踪和错误之后,我意识到CPU/GPU的利用率在这个错误发生之前就上升了。压力和超负荷,似乎是原因。因此,我缩小了屏幕分辨率,并为GPU提供了更多的RAM(这是在Raspberry Pi 2上)。瞧,这个错误消失了。 换句话说,我把骡子打包,直到它能走得更远。解决方案:减少负载。希望这在某种程度上是有意义的,并使你更接近解决方案。
问候。

很可能你不会太高兴,因为我无法给你一个简洁的答案,但我有完全相同的错误,事实上你的错误消息是我的搜索词(=未定义的符号:_znk18qabstractlistmodel7siblingiirk11qmodelindex)。我就是这样来到这里的。 因此,我的“解决方案”可能会提示您如何解决您的问题

在经历了大量乏味的跟踪和错误之后,我意识到CPU/GPU的利用率在这个错误发生之前就上升了。压力和超负荷,似乎是原因。因此,我缩小了屏幕分辨率,并为GPU提供了更多的RAM(这是在Raspberry Pi 2上)。瞧,这个错误消失了。 换句话说,我把骡子打包,直到它能走得更远。解决方案:减少负载。希望这在某种程度上是有意义的,并使你更接近解决方案。
您好。

您找到这个问题的解决方案了吗?我在运行名为QDSLRDASHORD的应用程序时遇到了完全相同的符号查找错误。如果你有一个解决方案,请张贴。谢谢。@snahl我相信这是因为系统上有两个版本的QT,我在/opt/qt5中从源代码构建了一个版本(即QT-5.5.1版),并且在系统中安装了4.8.6版。一切都很好(因为我提供了要使用的头和库的完整路径。但是在执行过程中,它将默认为系统版本。我记得,添加了
-Wl,-rpath,$(QTHOME)/链接器命令的lib
解决了此问题。您可以向LDD查询您正在使用的库的版本。抱歉,我是在发布准解决方案后才看到您的答复的。我也使用qt-5.5.1和Raspian OS。我当然会尝试更好的答案,谢谢。您找到了此问题的解决方案吗?我得到了完全相同的符号运行名为qDslrDashboard的应用程序时出现查找错误。如果您有解决方案,请发布。谢谢。@snahl我认为这是由于系统上有两个版本的QT造成的,我在/opt/qt5中使用了我从源代码生成的版本(即版本QT-5.5.1)我也在系统中安装了4.8.6版。一切都很好(因为我提供了要使用的头和库的完整路径。但是在执行过程中,它将默认为系统版本。我记得,添加了
-Wl,-rpath,$(QTHOME)/链接器命令的lib
解决了问题。您可以向LDD查询您正在使用的库的版本。抱歉,我在发布准解决方案后才看到您的答复。我也使用qt-5.5.1和Raspian OS。我当然会尝试更好的答案,谢谢。