【发布时间】:2020-07-22 00:22:31
【问题描述】:
我正在使用 KWallet 编写一个具有可选运行时依赖项的应用程序。这意味着如果在用户系统上安装了 KWallet,它就会被使用,如果没有,它仍然可以工作,但没有 KWallet 支持。
这是我加载库的方式,它是我的包装类的静态属性。然后在状态条件下的构造函数中,我从库中解析符号。
QLibrary Core::PSE::KWallet::lib("KF5Wallet");
...
lib.load();
openWallet = (OpenWallet) lib.resolve("_ZN7KWallet6Wallet10openWalletERK7QStringyNS0_8OpenTypeE");
networkWallet = (NetworkWallet) lib.resolve("_ZN7KWallet6Wallet13NetworkWalletEv");
destructor = (Destructor) lib.resolve("_ZN7KWallet6WalletD2Ev");
与 QLibrary 相同 - 函数也是我班级的静态成员,但我不确定这是否是个好主意。 这是我班上的定义
typedef ::KWallet::Wallet* (*OpenWallet)(const QString &, WId, ::KWallet::Wallet::OpenType);
typedef QString (*NetworkWallet)();
typedef void (*WalletOpened)(bool);
typedef void (*Destructor)();
static OpenWallet openWallet;
static NetworkWallet networkWallet;
static Destructor destructor;
这是我分配对象的方式
wallet = openWallet(networkWallet(), 0, ::KWallet::Wallet::Asynchronous);
一切都很好,直到我需要执行非静态成员,尤其是析构函数。据我所知,应该是这样的
((*wallet).(destructor))()
但这似乎不起作用。我对这个话题完全陌生,即使我以正确的方式开始我也不知道。
那么,如何调用这种方式加载类的析构函数呢?我如何调用它的其余成员?还是我应该以完全不同的方式更好地做到这一点?
附:我知道,有一个用于 KWallet 的 DBUS API,甚至是一些像 qtkeychain 这样的包装库,但我想了解使用这个示例制作这种依赖项的方式。
【问题讨论】:
-
除此之外,您为什么要尝试显式调用析构函数?你不应该简单地使用
delete wallet吗? -
老实说 - 我不知道。理论上我应该在同一个模块中分配和释放内存。更重要的是 - 我的主模块不知道用 KF5Wallet.so 的虚拟析构函数编写的代码,所以,我只是按照我的感觉和猜测。你认为这种情况在某个地方得到了深层次的处理吗?我可以像
delete wallet甚至wallet.deleteLater()这样称呼它吗? -
我猜你写了一个小的 .cpp 只是试图加载库并使用它。整个问题受到不完整的代码和模糊的描述的影响(尽管代码的运行时加载很困难,Qt 是一团糟,所以这是很自然的)。除了问题中的内容外,还要以我们不必了解 KWallet 的方式编写它。见stackoverflow.com/help/minimal-reproducible-example
标签: c++ qt dynamic shared-libraries