0

我正在使用一个名为 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.cstart_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();

那么我应该改变什么来通过库文件访问它呢?

我希望这足以说明问题。如果没有,我会尽快回答。

4

1 回答 1

1

__PRIVATE是一个#define用于 GCC 扩展的隐藏符号。有关定义,请参阅https://github.com/nullkey/glc/blob/master/src/glc/common/glc.h#L60和有关http://gcc.gnu.org/wiki/Visibility的更多信息GCC 扩展。

https://stackoverflow.com/a/12011284/2146478提供了一种无需重新编译即可取消隐藏符号的解决方案。你会想做这样的事情:

$ objcopy --globalize-symbol=start_capture /path/to/your/lib.a /path/to/new/lib.a
于 2013-03-13T14:21:21.367 回答