如何在 C++ 和 Qt 中使用在运行时加载的库

Posted

技术标签:

【中文标题】如何在 C++ 和 Qt 中使用在运行时加载的库【英文标题】:How to use a library loaded at runtime in C++ and Qt 【发布时间】:2015-05-20 22:50:19 【问题描述】:

我目前有一个在桌面和手机上运行的应用程序。桌面版需要功能齐全的 libfoo.so,而移动版只需要 libfoo.so 的一小部分。其他人已经实现了 libfoo-phone.so,它使用与 libfoo.so 相同的函数名来表示它实际实现的函数。

我目前包含 libfoo-phone.h,它像往常一样工作,因为它在编译时被链接。但是,当我在运行时通过 dlopen 链接时,我将无法包含头文件。有没有一种简单的方法可以让这项工作在没有一个巨大的包装器的情况下进行 100 次对 dlsym 的调用?

【问题讨论】:

即使你可以从共享库中转储所有符号,你也无法提供原型来正确调用函数,我想我会写一个python脚本来从头文件中提取所有函数原型并生成要在程序中使用的 c++ 代码,您甚至可以将其作为构建过程的一个步骤,以便按需更新代码。 clang 有一个很好的 python 甚至 c++ 接口来解析 c 代码,这将有助于使过程变得健壮。如果你能雇用我,我可以做到。 声明“但是,当我在运行时通过 dlopen 链接时,我将无法包含头文件。”没有意义。即使您没有“在运行时通过 dlopen 链接”,您仍然“将无法包含头文件”。头文件与运行时完全无关。头文件在编译时包含。运行时发生的事情完全不相关。您可以在代码中包含头文件,使用其#define-s 等,只要您的代码不直接引用外部库中的符号,您就可以 dlopen 它,并使用 dlsym 解析其符号. 如果你想在运行时链接为什么不使用 QLibrary? 【参考方案1】:

为什么要在运行时链接?只需根据当前构建目标(手机与桌面)链接到适当的 .so 即可。平台动态链接器会在可执行文件运行时自动为您加载 *.so,您不必担心库的运行时加载。你可以包含标题,引用你想要的所有符号,不会有任何问题。

【讨论】:

主要是因为这是一个巨大的项目,而且这个要求将引入唯一的编译时、特定形式的依赖项。此外,如果一个精简的桌面可以在编译时未确定的某些情况下加载 libfoo-phone.so,那就太好了。

以上是关于如何在 C++ 和 Qt 中使用在运行时加载的库的主要内容,如果未能解决你的问题,请参考以下文章

Visual C++ 应用程序中的 Qt 库错误

如何连接两个程序(c++,qt)

如何在 Android 上重新启动 Qt 或 c++ 中的程序?

Qt5、C++:未加载 QMYSQL 驱动程序

QT 运行构建时不包括正确的库

在运行时解密函数并使用它 QT c++