Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C代码如何在没有前导下划线的情况下调用外部函数?_C++_C_Macos_Clang - Fatal编程技术网

C++ C代码如何在没有前导下划线的情况下调用外部函数?

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

假设我有一个导出函数“Foo”的动态库(不是我写的)。如果我宣布它为

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
选项构建一个“粘合”库。