我正在尝试通过以下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
答案 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”。