首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在C/C++中,如何确定库是否静态链接

在C/C++中,如何确定库是否静态链接
EN

Stack Overflow用户
提问于 2021-05-04 09:43:23
回答 2查看 534关注 0票数 4

我有一个静态库,提供了一些功能。我有使用这个库的应用程序。其中一些应用程序是命令行应用程序或作为守护进程/服务运行的。其中一些应用程序是GUI应用程序。

库提供了提供GUI元素的功能,允许用户对其进行配置。我以两种口味构建库: GUI风味和CLI风味。然后,我将适当的版本链接到应用程序。

我希望能够通过将这个库的GUI功能分离成一个单独的提供GUI支持的“扩展”库来改进/简化问题。我的计划是在运行时,主库以某种方式检测GUI支持库的存在。如果存在,那么它将从提供必要功能的GUI库中实例化一个对象,如果不存在,则实例化来自自身的对象,该对象提供与“存根”函数相同的API,而“存根”函数不执行任何操作或酌情返回错误。这两个对象将继承一个公共的纯虚拟抽象基类。

这必须在运行时完成,因为我希望能够将主库的完全相同的二进制文件链接到CLI和GUI应用程序,而不依赖编译时开关,因为从定义上来说,编译时开关会导致不同的二进制文件。

我一直在考虑在主库中实现这样一个函数:

代码语言:javascript
运行
复制
bool SupportsGUI() { return false; }

然后在GUI支持库中实现相同的功能,如下所示:

代码语言:javascript
运行
复制
bool SupportsGUI() { return true; }

然后,在链接应用程序时,强制链接器解析链接,以便使用GUI支持库中的链接(如果存在的话)。

我想不出怎样才能让这件事奏效。

假设这两个库都是静态库,那么在运行时,我如何从一个库中确定链接应用程序是否也链接了另一个库?

或者,我如何在链接时覆盖在一个库中实现的一组函数,并在一个单独的库中实现一组等价的函数。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-04 11:20:14

这不需要作为运行时来完成。常见的解决方案是使用弱符号。这是库中的一个符号,当没有可链接到的“正常”符号时,就会使用它。基础库提供弱符号,GUI库可选择提供替换,静态链接器可将其计算出来。

票数 2
EN

Stack Overflow用户

发布于 2021-05-04 09:53:02

你需要一个插件加载系统。

  1. 插件API库定义接口(例如,一个抽象类,定义您想要调用的一些虚拟函数)

  1. 插件实现了实际的GUI代码。这是一个在运行时加载的共享库,包含硬编码路径和某种形式的可配置或固定路径/文件名。其他插件或应用程序本身实现了如果硬编码插件.

所使用的回退实现。

然后,

  1. 应用程序尝试加载GUI插件,并从这个动态加载的库中调用一个特定函数来创建GUI特定的插件对象。如果无法加载插件,则实例化回退对象.

您可以使用许多助手库来完成这类工作。Qt有一个QPluginLoader类,但是还有其他各种半通用包装器来从它们加载动态库和实例化插件接口。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67382346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档