我的编译器报告这个对openWallet(..)函数的未定义引用.如您所见,我已将链接响应库-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
有人能告诉我我做错了什么吗?哪里出错了?
SSCCE:
#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.cppg++ -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更改为:
INCLUDEPATH += \
...
/usr/include/KF5 \
/usr/include/KF5/KWallet/ \
...
如果您使用Qt 5和KF 5,则需要链接该库.基本上,您使用的是kde 4,因为kdeui是KDE 4库.您可以通过发出以下命令来检查自己:
dpkg -S /usr/lib/libkdeui.so
简而言之,在kdeui库中,WId是无符号的,因为这是在X11平台上使用的那个,而Qt 5混合可能会混淆了用于WId的quintptr,不知何故.虽然Qt 4的WId在不同平台上有所不同,但Qt 5的WId是五分音符,因此更清晰.
如果您计划将Qt 4与KDE 4一起使用,那么您的初始代码就可以了,但是您需要确保在这种情况下运行Qt 4的qmake而不是Qt 5.这可以通过使用qtchooser或直接运行正确的qmake二进制文件. qmake –version始终是您的朋友,以验证正在运行的版本.在我的Debian和Archlinux上,相应的qmake二进制文件称为qmake-qt4.
另一方面,你添加小部件模块很奇怪,但你希望删除gui,而前者取决于后者.看过项目文件中使用的小部件模块,我的观点更清楚,您可能希望在此时使用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();
}
main.pro
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)没有这个,但如果你愿意的话,你也许可以向后移植它.