如何在库中使用静态函数

时间:2016-02-26 07:30:34

标签: c++ static shared-libraries

我有一个库libxx,在该库中有一个静态函数foo()。 我想写另一个函数bar(),它使用函数foo()作为子例程。

如果没有在函数foo()所在的文件上编写bar()并重建库,有没有办法呢?

3 个答案:

答案 0 :(得分:3)

在翻译单元(目标文件/库)中声明函数static几乎使关于该函数实现的任何断言无效。它可以完全内联。它可能会使用具有调用约定的快捷方式,这在外部调用时是不正确的。

在某些操作系统/ ABI上,该函数在.globl指令ELF/Mach-O提供的意义上不会是“可见的”,链接器会阻止它,或者加载器不会解决它。在共享库中,它可能无法在本地使用之外保留位置独立性。关键是,你不能安全或便携地做到这一点。

简而言之,您需要将函数重新编译为非静态函数,即库中的全局/可见符号,或者具有bar()函数可用的静态版本。比方说,通过static inline

答案 1 :(得分:0)

不在标准C / C ++范围内。

该函数有一个可调用的地址或其他可能允许间接调用foo的函数。

但这些都是不好的解决方案

答案 2 :(得分:0)

听起来你有libxx的源代码。如果是这种情况,并且您希望bar()与foo()存在于同一个库中,那么在向其添加bar()之后,您需要重新编译libxx。

如果您的目标是从另一个程序/库调用libxx :: foo(),那么您可以将libxx链接到您的其他项目(其中包含bar())。一旦库链接到您的主项目,您需要做的就是调用正确的命名空间并调用foo()。将库链接到主项目需要使用链接器。不同的开发系统将有不同的方式来调用链接器。为了进一步研究,我建议您搜索" c ++链接到静态库 X "其中 X 是您的开发系统(例如:visual studio,xcode)。我假设这是一个基于你提出的标签的静态库,但也许你的意思是foo()是一个静态方法。如果它是静态方法并不重要,链接将以相同的方式工作。如果你对我写的时候的意思感到困惑"静态库"然后可能会研究静态和动态链接库之间的区别。