使用cppyy从Python解析C(C ++)调用方法

时间:2019-01-23 16:47:27

标签: python c++ c

在C项目中,我想使用Python工具进行测试,因此我集成了Cling和Cppyy python打包工具。

之后,我创建了一个简单的项目,例如this。并找到了this help

我有一个来源和一个标题。

header / pocket.h

#include <stdio.h>
void pocket(void);
int pocket_add(int op1, int op2);

source / pocket.c

#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

谢谢

1 个答案:

答案 0 :(得分:1)

cppyy假定使用C ++,即将应用名称修饰。为了确保项目的头文件中的声明可以在C和C ++中使用,请在从C ++中使用时加上extern“ C”。像这样:

{{1}}

这通常也对使用C ++代码的人有所帮助,因此不仅限于Python / cppyy。

编辑:忘了补充说,对于C标头,您也可以使用“ cppyy.c_include”代替“ cppyy.include”。