簡體   English   中英

如何在庫中使用靜態函數

[英]How to use a static function inside a library

我有一個庫libxx,並且在該庫中有一個靜態函數foo()。 我想編寫另一個函數bar(),它使用函數foo()作為子例程。

有什么方法可以在不將foo()所在的文件上寫入bar()並重建庫的情況下完成此操作?

在轉換單元(目標文件/庫)中聲明static函數幾乎會使有關該函數實現的任何聲明無效。 可以完全內聯。 它可能使用快捷方式以及在外部調用時不正確的調用約定。

在某些OS / ABI上,該功能在具有ELF/Mach-O.globl指令將提供的意義上是“不可見的”,並且鏈接程序將阻止它,否則加載程序將無法解析它。 在共享庫中,它可能不會在其本地使用范圍之外保留位置獨立性。 關鍵是,您無法安全或方便地執行此操作。

簡而言之,您需要將函數重新編譯為非靜態函數,即庫中的全局/可見符號,或者為bar()函數提供靜態版本。 說,通過static inline

不在標准C / C ++中。

該函數具有一個可調用的地址或其他允許foo被間接調用的函數。

但是這些都是不好的解決方案

聽起來您具有libxx的源代碼。 如果是這種情況,並且您希望bar()與foo()存在於同一庫中,則需要在添加bar()之后重新編譯libxx。

如果您的目標是從另一個程序/庫調用libxx :: foo(),則只需將libxx鏈接到另一個項目(其中包含bar())。 一旦庫鏈接到您的主項目,您所需要做的就是調用正確的名稱空間並調用foo()。 將庫鏈接到主項目將需要使用鏈接器。 不同的開發系統將具有不同的調用鏈接器的方式。 為了對此進行進一步的研究,我建議您搜索“鏈接到靜態庫X的 c ++”,其中X是您的開發系統(例如:visual studio,xcode)。 我假設這是一個基於您在問題上添加的標記的靜態庫,但也許您是說foo()是靜態方法。 不管它是否是靜態方法都沒有關系,鏈接將以相同的方式起作用。 如果您對編寫“靜態庫”時的意思感到困惑,那么研究靜態和動態鏈接庫之間的區別可能會很清楚。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM