[英]How to wrap a C++ function?
通过遵循本教程,我试图包装一个名为i_receive()
的c++
函数,我首先创建了wrap.c
文件,该文件的内容如下所示:
int i_receive(const uint32_t *f, int32_t t){
static int (*real_i_receive)(const uint32_t *, int32_t)=NULL;
printf("hello world");
return real_i_receive;
}
当我使用LD_PRELOAD
以LD_PRELOAD=/full/path/to/wrap.so ./mycppcode
运行某些C ++代码时,我使用gcc -fPIC -shared -o wrap.so wrap.c -ldl
编译了此文件。信息:
错误:ld.so:无法预加载来自LD_PRELOAD的对象'/full/path/to/wrap.so':已忽略。
我猜测原因可能是包装文件是C文件,并且我将其与C ++代码一起使用,对吗?
我将文件更改为具有相同内容的wrap.cc
,以与以前相同的方式编译时,我得到:
错误:从
'int (*)(const uint32_t*, int32_t)' to 'int'
无效转换
更换
return real_i_receive;
与
return real_i_receive(f, t);
实际上,函数的返回类型为int
但您正在返回函数指针。
首先,您遇到的第二个错误是您将指针返回给函数类型而不是int类型。
如果要返回一个int,请从代码中调用该函数:
return real_i_receive(f,t);
注意“()”,它表示函数调用。
关于您的猜测:无论您使用的是C还是C ++代码,这些库都是汇编代码。
导出C函数和C ++函数之间的区别是名称修改。 您宁愿将函数导出为C函数,以便能够通过未修饰的名称在库中访问它。
要导出不带名称修饰功能的函数,可以使用extern“ C”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.