繁体   English   中英

如何包装C ++函数?

[英]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_PRELOADLD_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM