前言: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)
文章目录