如何包装C ++函数?

时间:2015-03-24 08:01:26

标签: c++ function

我正在尝试通过以下this教程包装名为c++的{​​{1}}函数,我首先创建了一个i_receive()文件,此文件的内容是这样的:

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; } 编译了这个文件,当我使用gcc -fPIC -shared -o wrap.so wrap.c -ldl运行一些带有LD_PRELOAD的C ++代码时,我得到了这样的信息:

  

错误:ld.so:LD_PRELOAD中的对象'/full/path/to/wrap.so'无法预加载:ignored`。

我猜的原因可能是包装文件是一个C文件,而我正在使用它与C ++代码,我是对的吗?

我使用相同的内容将文件更改为LD_PRELOAD=/full/path/to/wrap.so ./mycppcode,当以与以前相同的方式进行编译时,我得到了:

  

错误:从wrap.cc

转换无效

2 个答案:

答案 0 :(得分:1)

替换

return real_i_receive;

return real_i_receive(f, t);

实际上,函数的返回类型是int但是你返回一个函数指针。

答案 1 :(得分:1)

首先,你的第二个错误是因为你将指针返回到函数类型而不是int类型。

如果要返回int,请从代码中调用该函数:

return real_i_receive(f,t);

注意“()”表示函数调用。

关于您的猜测:如果使用C或C ++代码无关紧要,则库是所有汇编代码。

导出C函数和C ++函数之间的一个区别是名称错误。您宁愿将函数导出为C函数,以便能够通过未拼写的名称在库中访问它。

要导出一个没有名称的函数,可以使用extern“C”。