gpt4 book ai didi

c++ - 链接错误 : undefined reference

转载 作者:IT王子 更新时间:2023-10-29 00:35:06 24 4
gpt4 key购买 nike

我的编译器报告了对 openWallet(..) 函数的 undefined reference 。如您所见,我已链接响应库 -L/usr/lib -lkdeui -kdecore -lkparts

错误:

password.cpp:(.text+0x29): undefined reference to `KWallet::Wallet::openWallet(QString const&, unsigned long long, KWallet::Wallet::OpenType)'

编译命令:

g++ -Wl,-O1 -Wl,-rpath-link,/usr/lib/x86_64-linux-gnu -o password_client "ALL *.o FILES" -L/usr/lib -lkdecore -lkdeui -lkparts -lglib-2.0 -L/usr/X11R6/lib64 -L/usr/lib/x86_64-linux-gnu -lGL -lpthread

QtCreator 报了同样的错误。 .pro 文件包含

LIBS += -lkdecore \
-lkdeui \
-lkparts

我已经安装了所有需要的库。证明:

nm -D/usr/lib/libkdeui.so 的输出 | grep openWallet 是:

000000000032df70 T _ZN7KWallet6Wallet10openWalletERK7QStringmNS0_8OpenTypeE

如您所见,libkdeui.so 文件中有该函数。 ^^

我已经安装了库:

sudo apt-get install kdelibs5-dev libkparts4

有人能告诉我我做错了什么吗?哪里错了?

中南合作:

#include <QCoreApplication>
#include <KWallet/Wallet>

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
using namespace KWallet;

Wallet* wallet = Wallet::openWallet(Wallet::LocalWallet(), 0);
return a.exec();
}

.pro 文件:

QT       += core 

TARGET = untitled

TEMPLATE = app

SOURCES += main.cpp

LIBS += -lkdeui -lkdecore -lkparts

INCLUDEPATH += /usr/include/KDE \
/usr/include/KDE/KWallet

编译:

g++ -c -m64 -pipe -O2 -Wall -W -D_REENTRANT -fPIE -DQT_NO_DEBUG -DQT_DBUS_LIB -DQT_CORE_LIB -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -I. -I/usr/include/KDE -I/usr/include/KDE/KWallet -ITDIR/include/QtGui -ITDIR/include -I. -o main.o main.cpp

g++ -m64 -Wl,-O1 -o untitled main.o -L/usr/lib -L/usr/X11R6/lib64 -lkdeui -lkdecore -lkparts -L/usr/lib/x86_64-linux-gnu -lGL -lpthread

最佳答案

您的主要问题是您将 Qt 5 与 KDE Frameworks 5 混在一起。那不会像那样飞起来。自己看这个:

KDE 4 related linkage: -lkdeui -lkdecore -lkparts
Qt 5 related linkage: -lQt5Widgets -lQt5Gui -lQt5Core

修复相对简单:

LIBS += -lkdecore -lkparts -lKF5Wallet
^^^^^^^^^^^

当然,如果您转到 KF5,您还需要将包含路径更改为:

INCLUDEPATH += \
...
/usr/include/KF5 \
/usr/include/KF5/KWallet/ \
...

如果您使用 Qt 5 和 KF 5,您将需要链接到该库。基本上,您使用的是 kde 4,因为 kdeui 是一个 KDE 4 库。您可以通过发出以下命令自行检查:

dpkg -S /usr/lib/libkdeui.so

简而言之,WId 在 kdeui 库中是 unsigned long 因为这是在 X11 平台上使用的,而 Qt 5 组合可能混淆了quintptrWId 中,不知何故。 Qt 4 的 WId 对于不同的平台是不同的,Qt 5 的 WId 是 quintptr,这样就更清楚了。

如果您计划将 Qt 4 与 KDE 4 一起使用,您的初始代码是可以的,但您需要确保在这种情况下运行 Qt 4 的 qmake 而不是 Qt 5 的。这可以通过使用 qtchooser 或直接运行适当的 qmake 二进制文件来实现。 qmake --version 始终是您验证正在运行的版本的 friend 。在我的 Debian 和 Archlinux 上,相应的 qmake 二进制文件称为 qmake-qt4

附带说明一下,很奇怪您添加了widgets 模块,但您希望删除gui,而前者依赖于后者。看过项目文件中使用的 widgets 模块后,我的意见更加明确,此时您可能希望同时使用 Qt 5 和 KF 5。

这是我工作的 Qt 5 和 KF 5 测试片段:

main.cpp

#include <QCoreApplication>
#include <KWallet>

using KWallet::Wallet;

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
KWallet::Wallet* wallet = Wallet::openWallet(Wallet::LocalWallet(), 0);
return a.exec();
}

主程序

TARGET = kwallet-test
TEMPLATE = app
SOURCES += main.cpp
LIBS += -lKF5Wallet
INCLUDEPATH += /usr/include/KF5/KWallet

构建

qmake && make

要在 Ubuntu 上运行,您需要安装以下已添加到 Utopic (14.10) 的软件包:

sudo apt-get install libkf5wallet-dev

不幸的是,Trusty Tahr (14.04) 没有提供此功能,但如果您愿意,您可以向后移植它。

关于c++ - 链接错误 : undefined reference,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27129959/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com