首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用cppyy解析Python中的C (C++)调用方法

使用cppyy解析Python中的C (C++)调用方法
EN

Stack Overflow用户
提问于 2019-01-23 16:47:27
回答 1查看 474关注 0票数 1

在一个C项目中,我希望使用Python工具进行测试,因此我集成了Cppyy和Cppyy包工具。

之后,我创建了一个像这样的简单项目。找到了这种帮助

我有一个源和一个头。

页眉/口袋.h

代码语言:javascript
复制
#include <stdio.h>
void pocket(void);
int pocket_add(int op1, int op2);

来源/袖珍c

代码语言:javascript
复制
#include <pocket.h>
void pocket(void)
{
  printf("Hello, pocket!\n");
}

int pocket_add(int op1, int op2)
{
  return op1 + op2;
}

我在python解释器上有这个错误

IncrementalExecutor::executeFunction:符号'_Z6pocketv‘未解析,而链接符号'__cf_6'!您可能遗漏了袖珍()的定义,也许您需要加载相应的共享库?错误:编译失败

通过Python解释器:检查结果

代码语言:javascript
复制
import cppyy
cppyy.include('include/pocket.h')
cppyy.load_library('build/libpocket.so')
cppyy.gbl.pocket()

IncrementalExecutor::executeFunction:符号'_Z6pocketv‘未解析,而链接符号'__cf_6'!您可能遗漏了袖珍()的定义,也许您需要加载相应的共享库?错误:编译失败

来源

代码语言:javascript
复制
#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

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-23 21:59:52

cppyy假设C++,即名称损坏将被应用。为了确保您的项目的头文件中的声明可以同时从C和C++中使用,在从C++中使用时添加extern "C“。就像这样:

代码语言:javascript
复制
#include <stdio.h>

#ifdef __cplusplus
extern "C" {
#endif

void pocket(void);
int pocket_add(int op1, int op2);

#ifdef __cplusplus
}
#endif

对于使用C++代码的人来说,这通常也是有帮助的,所以这不仅适用于Python/cppyy。

编辑:忘了为C头添加"cppyy.c_include“而不是"cppyy.include”。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54331986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档