在C项目中,我想使用Python工具进行测试,因此我集成了Cling和Cppyy python打包工具。
之后,我创建了一个简单的项目,例如this。并找到了this help。
我有一个来源和一个标题。
#include <stdio.h>
void pocket(void);
int pocket_add(int op1, int op2);
#include <pocket.h>
void pocket(void)
{
printf("Hello, pocket!\n");
}
int pocket_add(int op1, int op2)
{
return op1 + op2;
}
我在python解释器上遇到此错误
IncrementalExecutor :: executeFunction:链接符号'__cf_6'时无法解析符号'_Z6pocketv'! 您可能缺少Pocket()的定义 也许您需要加载相应的共享库? 错误:无法编译
通过Python解释器检查结果:
import cppyy
cppyy.include('include/pocket.h')
cppyy.load_library('build/libpocket.so')
cppyy.gbl.pocket()
IncrementalExecutor :: executeFunction:链接符号'__cf_6'时无法解析符号'_Z6pocketv'! 您可能缺少pocket()的定义 也许您需要加载相应的共享库? 错误:无法编译
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wformat-security"
__attribute__((used)) extern "C" void __cf_6(void* obj, int nargs, void** args, void* ret)
{
((void (&)())pocket)();
return;
}
#pragma clang diagnostic pop
谢谢
答案 0 :(得分:1)
cppyy假定使用C ++,即将应用名称修饰。为了确保项目的头文件中的声明可以在C和C ++中使用,请在从C ++中使用时加上extern“ C”。像这样:
{{1}}
这通常也对使用C ++代码的人有所帮助,因此不仅限于Python / cppyy。
编辑:忘了补充说,对于C标头,您也可以使用“ cppyy.c_include”代替“ cppyy.include”。