如何在库中使用静态函数
How to use a static function inside a library
我有一个库libxx,在该库中有一个静态函数foo()。我想编写另一个函数 bar(),它使用函数 foo() 作为子例程。
有没有办法在不将 bar() 写入函数 foo() 所在的文件并重建库的情况下做到这一点?
在翻译单元(对象文件/库)中static
声明函数几乎会使有关该函数实现的任何断言无效。它可以完全内联。它可能会对调用约定使用快捷方式,这些快捷方式在外部调用时会不正确。
在某些 OS/ABI 上,该函数将不"可见",因为带有 ELF/Mach-O
的 .globl
指令将提供,链接器将阻止它,或者加载器不会解析它。在共享库中,它可能不会保留其本地使用之外的位置独立性。关键是,您无法安全或便携地执行此操作。
简而言之,您需要将函数重新编译为非静态函数,即库中的全局/可见符号,或者为您的bar()
函数提供静态版本。说,通过static inline
.
听起来你有libxx的源代码。如果是这种情况,并且您希望 bar() 与 foo() 存在于同一个库中,那么您需要在添加 bar() 后重新编译 libxx。
如果你的目标是从另一个程序/库调用libxx::foo(),那么你可以将libxx链接到你的另一个项目(其中有bar())。一旦库链接到你的主项目,你需要做的就是调用正确的命名空间并调用 foo()。将库链接到主项目需要使用链接器。不同的开发系统将具有不同的链接器调用方式。为了进一步研究这个问题,我建议你搜索"链接到静态库X的c ++",其中X是你的开发系统(例如:Visual Studio,xcode)。我假设这是一个基于您在问题上放置的标签的静态库,但也许您的意思是 foo() 是一种静态方法。无论它是否是静态方法,链接都将以相同的方式工作。如果您对我写"静态库"时的意思感到困惑,那么也许研究静态库和动态链接库之间的区别会澄清。
标准 C/C++ 范围内。
该函数具有可调用的地址或其他可能允许间接调用foo
的函数。
但这些都是糟糕的解决方案
- 给定一个C++嵌套的私有结构类型,是否有从文件范围静态函数访问它的策略
- 检查编译时是否存在静态函数
- 名称隐藏对静态函数继承的实例使用
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- 类中静态函数C++意外结果
- 在工人类中使用不同类的静态函数进行实验
- 类 Referention 中C++回调函数引用非静态函数
- 指向模板上下文中的成员函数或静态函数的指针
- 如何检测 Clang AST C++中的静态函数
- 内联asm编译器屏障(内存阻塞器)是算作外部函数,还是算作静态函数调用
- 如何在静态函数中使用成员函数数组
- (2 问题)"类"类型重新定义(即使 #pragma 一次),以及静态函数内的静态成员对象初始化?
- 生成代码(在编译时)以调用模板的每个实例化的静态函数
- C++无法访问或使用静态函数
- 如何将 cpp 文件中的静态函数公开给其他文件
- 将函数的引用设置为其他 c++ 文件中的非静态函数
- 方法的静态函数的等价性
- 扩展包含静态函数的类
- 非静态函数可以访问静态变量吗?
- 调用非静态函数作为谓词?