假设我有一个导出函数“Foo”的dylib(不是我写的)。如果我将其声明为
extern "C" void Foo(void);
并尝试调用它,我收到一个链接器错误,说它_Foo
丢失了。如何在不修改 dylib 的情况下处理这个问题?也许是一些晦涩的链接器标志,或者声明上的 Clang 标记,使其不期望下划线?
对于这些函数中的一小部分,最简单的方法是使用 gcc/clang 扩展(非常适合 OS X)将外部链接声明为程序集:
extern void Foo(void) asm ("Foo");
有关更多详细信息,请参阅此答案。
您可以尝试使用手动加载函数dlsym
:
#include <dlfcn.h>
static void (*Foo)(void);
/* In some initialization function... */
Foo = dlsym(RTLD_DEFAULT, "Foo");