c – 链接错误:未定义的引用

我的编译器报告这个对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.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更改为:

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)没有这个,但如果你愿意的话,你也许可以向后移植它.

上一篇:linux – Eclipse – 无法设置首选项


下一篇:用python获取窗口标题?