代码之家  ›  专栏  ›  技术社区  ›  Gromph

用CPYPY解析Python中的C(C++)调用方法

  •  0
  • Gromph  · 技术社区  · 7 年前

    在一个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:symbol'z6pocketv'在链接symbol'uu cf_6'时未解析! 您可能缺少pocket()的定义。 也许您需要加载相应的共享库? 错误:编译失败

    通过python解释器检查结果:

    import cppyy
    cppyy.include('include/pocket.h')
    cppyy.load_library('build/libpocket.so')
    cppyy.gbl.pocket()
    

    incrementalExecutor::executeFunction:symbol'z6pocketv'在链接symbol'uu cf_6'时未解析! 您可能缺少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 回复  |  直到 7 年前
        1
  •  1
  •   Wim Lavrijsen    7 年前

    CPPYY假定C++,即将应用名字命名。为了确保项目的头文件中的声明既可以从C和C++使用,也可以从C++使用时添加EXTEN“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。

    编辑:忘记添加,您也可以使用“cppyy.c_include”而不是“cppyy.include”作为c头。