繁体   English   中英

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

[英]In C/C++, how do I determine if a library is statically linked or not

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

该库提供了提供 GUI 元素以允许用户对其进行配置的功能。 我以两种方式构建图书馆; GUI 风格和 CLI 风格。 然后我将适当的版本链接到应用程序。

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

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

我一直在考虑在主库中实现 function,如下所示:

bool SupportsGUI() { return false; }

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

bool SupportsGUI() { return true; }

然后,在链接应用程序时,以某种方式强制 linker 解析链接以使用 GUI 支持库中的链接(如果存在)。

我无法弄清楚如何让它发挥作用。

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

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

不需要作为运行时完成。 常见的解决方案是使用弱符号 这是库中的一个符号,当没有“正常”符号可链接时使用。 您的基础库提供了弱符号,您的 GUI 库可以选择提供替换,static linker 可以解决这个问题。

为此,您需要一个插件加载系统。

  1. 插件 API 库定义了接口(例如,一个抽象的 class 定义了一些您希望能够调用的虚拟函数)

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

  3. 然后应用程序尝试加载 GUI 插件并从该动态加载的库中调用特定的 function 以创建 GUI 特定插件 object。 如果无法加载插件,它会实例化后备 object。

您可以使用许多帮助程序库来执行此类操作。 Qt 有一个QPluginLoader class 但是还有其他各种半通用包装器来加载动态库并从中实例化插件接口。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM