在一个C项目中,我希望使用Python工具进行测试,因此我集成了Cppyy和Cppyy包工具。
之后,我创建了一个像这这样的简单项目。找到了这种帮助。
我有一个源和一个头。
页眉/口袋.h
#include <stdio.h>
void pocket(void);
int pocket_add(int op1, int op2);来源/袖珍c
#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解释器:检查结果
import cppyy
cppyy.include('include/pocket.h')
cppyy.load_library('build/libpocket.so')
cppyy.gbl.pocket()IncrementalExecutor::executeFunction:符号'_Z6pocketv‘未解析,而链接符号'__cf_6'!您可能遗漏了袖珍()的定义,也许您需要加载相应的共享库?错误:编译失败
来源
#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谢谢
发布于 2019-01-23 21:59:52
cppyy假设C++,即名称损坏将被应用。为了确保您的项目的头文件中的声明可以同时从C和C++中使用,在从C++中使用时添加extern "C“。就像这样:
#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”。
https://stackoverflow.com/questions/54331986
复制相似问题