簡體   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