我有一个静态库,提供了一些功能。我有使用这个库的应用程序。其中一些应用程序是命令行应用程序或作为守护进程/服务运行的。其中一些应用程序是GUI应用程序。
库提供了提供GUI元素的功能,允许用户对其进行配置。我以两种口味构建库: GUI风味和CLI风味。然后,我将适当的版本链接到应用程序。
我希望能够通过将这个库的GUI功能分离成一个单独的提供GUI支持的“扩展”库来改进/简化问题。我的计划是在运行时,主库以某种方式检测GUI支持库的存在。如果存在,那么它将从提供必要功能的GUI库中实例化一个对象,如果不存在,则实例化来自自身的对象,该对象提供与“存根”函数相同的API,而“存根”函数不执行任何操作或酌情返回错误。这两个对象将继承一个公共的纯虚拟抽象基类。
这必须在运行时完成,因为我希望能够将主库的完全相同的二进制文件链接到CLI和GUI应用程序,而不依赖编译时开关,因为从定义上来说,编译时开关会导致不同的二进制文件。
我一直在考虑在主库中实现这样一个函数:
bool SupportsGUI() { return false; }
然后在GUI支持库中实现相同的功能,如下所示:
bool SupportsGUI() { return true; }
然后,在链接应用程序时,强制链接器解析链接,以便使用GUI支持库中的链接(如果存在的话)。
我想不出怎样才能让这件事奏效。
假设这两个库都是静态库,那么在运行时,我如何从一个库中确定链接应用程序是否也链接了另一个库?
或者,我如何在链接时覆盖在一个库中实现的一组函数,并在一个单独的库中实现一组等价的函数。
发布于 2021-05-04 11:20:14
这不需要作为运行时来完成。常见的解决方案是使用弱符号。这是库中的一个符号,当没有可链接到的“正常”符号时,就会使用它。基础库提供弱符号,GUI库可选择提供替换,静态链接器可将其计算出来。
发布于 2021-05-04 09:53:02
你需要一个插件加载系统。
所使用的回退实现。
然后,
。
您可以使用许多助手库来完成这类工作。Qt有一个QPluginLoader
类,但是还有其他各种半通用包装器来从它们加载动态库和实例化插件接口。
https://stackoverflow.com/questions/67382346
复制相似问题