[linux][原创]C++ so库的编译python调用

test.h

#pragma once


#include <stdio.h>

extern "C" int Add(int a, int b);
extern "C" int Max(int a,int b);

test.cpp


#include "test.h"

extern "C" int Add(int a, int b)
{
    return a + b;
}
extern "C" int Max(int a, int b)
{
    if (a > b)
        return a;
    return b;
}

注意:#include "stdafx.h"不要写进去否则编译so库出错,第二需要些extern "C",不写可以编译成so库但是调用会提示undefinedsymbol错误

 

编译成so库,注意先切换到test.cpp所在目录,可以不用加lib

gcc test.cpp -fPIC -shared -o libtest.so

写成gcc test.cpp -fPIC -shared -o test.so也可以会生成test.so库

python调用

from ctypes import cdll

test = cdll.LoadLibrary(/home/username/Downloads/libtest.so)

result = test.Add(4,5)

print(result)

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: C语言编译出的二进制文件不能直接Python调用,需要通过某些方式间接地调用,常见的方式有以下几种: 1. 使用ctypes,在Python代码中调用C语言写的动态链接。 2. 使用Cython,将C语言代码编译为Cython代码,再通过Cython生成的Python模块调用C语言代码。 3. 使用SWIG,将C语言代码封装成Python模块。 详细实现方式可以参考相关教程或文档。 ### 回答2: 在Python中,可以通过使用`ctypes`模块来调用C编写的程序。`ctypes`是Python标准提供的模块,它允许Python调用动态链接(DLL)中的函数。 首先,需要确保C程序已经被编译成动态链接(DLL)文件。可以使用常见的C编译器(如gcc)将C代码编译为共享对象(.so)文件。 在Python中,需要导入`ctypes`模块,并使用`cdll`加载动态链接。以下是一个示例代码: ``` import ctypes # 加载动态链接 lib = ctypes.CDLL('/path/to/c_program.so') # 调用C函数 lib.function_name(arguments) ``` 在代码中,`/path/to/c_program.so`是C程序编译后生成的动态链接文件路径。`function_name`是C程序中的函数名,可以根据实际情况修改。 需要注意的是,调用C函数时需要指定参数类型和返回值类型。如果C函数接受和返回的是C语言中的基本类型(如整数、浮点数),可以使用`c_int`、`c_float`等类型。如果C函数接受和返回的是指针或结构体等复杂类型,需要在Python中定义对应的结构体或类型。 综上所述,通过`ctypes`模块可以方便地在Python调用已经编译好的C程序。 ### 回答3: 在C程序编译之后,我们可以通过Python的ctypes模块来调用它。ctypes是Python的一个外部函数的包装器,可以用于调用C函数中的函数。 首先,我们需要将C程序编译成一个动态链接文件(.so文件),这可以通过在C程序中使用编译器的特定选项来完成。 然后,在Python中使用ctypes模块加载编译后的动态链接文件,并定义C函数的原型,以便Python能够正确地调用它。 下面是一个简单的例子,假设我们有一个名为“my_c_program.c”的C程序,其中包含一个名为“my_function”的函数,该函数接受一个整数参数并返回一个整数: // my_c_program.c文件 #include <stdio.h> int my_function(int num) { printf("Hello from C program! You passed %d\n", num); return num * 2; } 接下来,我们将使用gcc编译器将该C程序编译为动态链接文件: $ gcc -shared -o my_c_program.so my_c_program.c 在Python调用该动态链接文件: import ctypes # 加载动态链接 c_program = ctypes.CDLL('./my_c_program.so') # 定义my_function的参数类型和返回类型 c_program.my_function.argtypes = [ctypes.c_int] c_program.my_function.restype = ctypes.c_int # 调用C函数 result = c_program.my_function(42) print(f"Result from C function: {result}") 运行上述Python代码,它将输出以下内容: Hello from C program! You passed 42 Result from C function: 84 这说明我们成功地调用编译后的C程序,并从Python中获取了返回的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FL1623863129

你的打赏是我写文章最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值