ctypes调用C/C++
前言:linux的动态链接库后缀为.so,Windows为dll。
一、windows环境
1.配置mingw64
Windows环境可以使用mingw64进行编译。
下载地址:https://sourceforge.net/projects/mingw-w64/files/
win下载win32-seh。
之后解压再添加环境变量即可。
2.测试代码
在mingw64中,有gcc和g++两种编译器。
若要在windows中让python调用g++编译器编译的函数需要加一个参数。测试代码如下:
#include <iostream>
// 判断是否为windows
#ifdef _WIN32
#define XLIB __declspec(dllexport)
#else
#define XLIB
#endif
extern "C" XLIB int add_func(int a, int b)
{
int c = a + b;
std::cout << c << std::endl;
return c;
}
# 用于编译输出dll文件
# g++ -shared -fPIC -o xxx.dll xxx.cpp
import os
out_file = ".\\c_lib\\test1.dll"
os.system("g++ -shared -fPIC .\\c_lib\\test1.cpp -o {}".format(out_file))
import ctypes
out_file = "./c_lib/test1"
# 在使用g++编译器编译时需要加winmode=0的参数,否则会报错,找不到模块
clib = ctypes.WinDLL(out_file, winmode=0)
res = clib.add_func(ctypes.c_int(2), ctypes.c_int(4))
print(res)
二、Linux环境
未测试,但原理基本相同,只是在py文件中需要将WinDll修改为cdll.LoadLibrary或使用CDLL调用,并且重新编译动态链接库为.so文件。
import ctypes
out_file = "./c_lib/test1"
# 在使用g++编译器编译时需要加winmode=0的参数,否则会报错,找不到模块
clib = ctypes.CDLL(out_file)
res = clib.add_func(ctypes.c_int(2), ctypes.c_int(4))
print(res)
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。