我正在使用一个名为GLC的C库以编程方式记录我的OpenGL缓冲区。
GLC会监听按键,这并不是一个以编程方式触发的好方法。
因此,我想通过软件中的函数调用从GLC执行记录。
我的C ++软件正在链接到包含所需功能start_capture()
的库。通过nm,我可以看到此函数是本地函数,并标有小写字母t。
由于在我的软件中访问它必须是全局的,因此我想重新编译该库(我已经完成了)。但我不知道要进行哪些更改以使其易于访问。
这是头文件lib.h中start_capture()
的声明
...
__PRIVATE int start_capture(); // No idea where the __PRIVATE is coming from
...
这是main.c中
start_capture()
函数的定义/实现:int start_capture()
...
return ret;
}
这是我的dlopen获取功能:
void *handle_so;
void (*start_capture_custom)();
char *error_so;
handle_so = dlopen("/home/jrick/fuerte_workspace/sandbox/Bag2Film/helper/libglc-hook.so", RTLD_LAZY);
if (!handle_so)
{
fprintf(stderr, "%s\n", dlerror());
exit(1);
}
dlerror(); /* Clear any existing error */
start_capture_custom = (void (*)())dlsym(handle_so, "start_capture");
if ((error_so = dlerror()) != NULL)
{
fprintf(stderr, "%s\n", error_so);
exit(1);
}
start_capture_custom();
dlclose(handle_so);
start_capture();
那么我应该更改些什么才能通过库文件访问它?
我希望这足以说明问题。如果没有,我会尽快回答。
最佳答案
__PRIVATE
是用于GCC扩展名以隐藏符号的#define
。有关定义,请参见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