使本地c库函数可以全局访问

时间:2013-03-13 13:41:57

标签: c++ dynamic local dynamic-linking dlopen

我正在使用一个名为GLC的C库以编程方式记录我的OpenGL缓冲区。 GLC监听按键操作,这不是一个以编程方式触发的好方法。

因此我想通过我的软件中的函数调用从GLC执行录制。 我的C ++软件链接到包含所需函数start_capture()的库。通过nm我可以看到这个函数是本地的,用小写t标记。

由于在我的软件中访问它必须是全局的,我想重新编译库(我已经完成了)。但是我不知道要改变什么来让它可以访问....

以下是start_capture()在头文件lib.h

中的声明
...
__PRIVATE int start_capture(); // No idea where the __PRIVATE is coming from
...

这是main.c中<{1}}函数的定义/实现:

start_capture()

这是我获得该功能的dlopen:

int start_capture()
...
return ret;
}

那么我应该通过库文件更改以访问它?

我希望这足以让问题变得清晰。如果没有,我会尽快回答。

1 个答案:

答案 0 :(得分:1)

__PRIVATE#define,用于隐藏符号的GCC扩展程序。有关定义,请参阅https://github.com/nullkey/glc/blob/master/src/glc/common/glc.h#L60;有关GCC扩展程序的详情,请参见http://gcc.gnu.org/wiki/Visibility

https://stackoverflow.com/a/12011284/2146478提供了一种解决方案,可以在不重新编译的情况下取消隐藏符号。您可能希望执行以下操作:

$ objcopy --globalize-symbol=start_capture /path/to/your/lib.a /path/to/new/lib.a