C++ C代码如何在没有前导下划线的情况下调用外部函数?
假设我有一个导出函数“Foo”的动态库(不是我写的)。如果我宣布它为C++ C代码如何在没有前导下划线的情况下调用外部函数?,c++,c,macos,clang,C++,C,Macos,Clang,假设我有一个导出函数“Foo”的动态库(不是我写的)。如果我宣布它为 extern "C" void Foo(void); 试着调用它,我得到一个链接器错误,说\u Foo丢失了。我如何在不修改动态库的情况下处理这个问题?可能是一些模糊的链接器标志,或声明上的叮当标记,使其不需要下划线?您可以尝试使用dlsym手动加载函数: #include <dlfcn.h> static void (*Foo)(void); /* In some initialization functi
extern "C" void Foo(void);
试着调用它,我得到一个链接器错误,说
\u Foo
丢失了。我如何在不修改动态库的情况下处理这个问题?可能是一些模糊的链接器标志,或声明上的叮当标记,使其不需要下划线?您可以尝试使用dlsym
手动加载函数:
#include <dlfcn.h>
static void (*Foo)(void);
/* In some initialization function... */
Foo = dlsym(RTLD_DEFAULT, "Foo");
#包括
静态空隙(*Foo)(空隙);
/*在某些初始化函数中*/
Foo=dlsym(RTLD_默认为“Foo”);
您可以尝试使用dlsym
手动加载函数:
#include <dlfcn.h>
static void (*Foo)(void);
/* In some initialization function... */
Foo = dlsym(RTLD_DEFAULT, "Foo");
#包括
静态空隙(*Foo)(空隙);
/*在某些初始化函数中*/
Foo=dlsym(RTLD_默认为“Foo”);
对于这些函数中的一小部分,最简单的方法是使用gcc/clang扩展(非常适合OS X)将外部链接声明为程序集:
extern void Foo(void) asm ("Foo");
有关更多详细信息,请参阅。对于这些函数中的一小部分,使用gcc/clang扩展(非常适合OS X)来声明外部链接为程序集是最简单的:
extern void Foo(void) asm ("Foo");
有关详细信息,请参阅。是否使用和
dlsym
获取导出函数的指针?@Praetorian:不,我希望不必获取函数指针。CLANG linker是否支持DEF文件?@JWWalker然后您必须寻找一个链接器选项,该选项允许静态绑定到动态库。例如,MSVC可以在链接时解析DLL中的函数地址,从而避免手动LoadLibrary
和GetProcAddress
获取函数指针。您是否使用和dlsym
获取导出函数的指针?@Praetorian:no,我希望不必获取函数指针。CLANG链接器是否支持DEF文件?@JWWalker然后您必须寻找一个链接器选项,该选项允许您静态绑定到动态库。例如,MSVC可以在链接时解析DLL中的函数地址,从而避免了手动LoadLibrary
和GetProcAddress
获取函数指针。哦,很好,这正是OP想要的。您可以对其进行宏化:#定义NO#UND(func)extern void func(void)asm(#func)代码>酷。作为记录,在发布之前,我想到了一个不太好的方法:使用链接器的-alias
或-alias\u list
选项构建一个“粘合”库。哦,很好,这正是OP想要的。您可以对其进行宏化:#定义NO#UND(func)extern void func(void)asm(#func)代码>酷。作为记录,在发布之前,我想到了一个稍微不太好的方法:使用链接器的-alias
或-alias\u list
选项构建一个“粘合”库。