python、c++混合编程

1. 使用ctypes直接调用c/c++动态链接库
  • linux 下动态链接库可有gcc直接生成
  • windows下可以由vs生成
    (1) 新建动态链接库项目
    (2) 在cpp文件中加入
#define DLLEXPORT extern "C" __declspec(dllexport) 
//放在 #include "stdafx.h" 之后

在 需要导数的函数前加DLLEXPORT,例如:

DLLEXPORT int sum(int a, int b) {
    return a + b;
}

(3) 生成动态链接库

  • python调用方法
import ctypes
import os


class NuclearExplosion:
    path = os.path.dirname(os.path.dirname(__file__))
  
    dll = ctypes.cdll.LoadLibrary(path + "/NuclearExplosion/ccdll/x64/Debug/ccdll.dll")

    fRE = ctypes.c_double(6370)  # 地球半径,单位:km
    PI = ctypes.c_double(3.14)
    fPhi0 = ctypes.c_double(44.7)  # 爆点磁倾角
    fT = ctypes.c_double(1)  # 爆后时间,单位:min
    fW = ctypes.c_double(1)  # 爆炸当量,单位:MT TNT
    fH = ctypes.c_double(200)  # 观测点高度,单位:km
    fD = ctypes.c_double(1000)  # 爆点与观测点的地面距离,单位:km
    fH0 = ctypes.c_double(60)  # 爆点高度,单位:km
    fkTx = ctypes.c_double(1.5)

    # 爆炸地点和时间
    fLat = ctypes.c_double(30)  # 爆点纬度,单位:°,北纬为正,南纬为负
    fLon = ctypes.c_double(114)  # 爆点经度,单位:°,东经为正,西经为负
    fmmdd = ctypes.c_int(321)  # 爆炸日期
    fyyyy = ctypes.c_int(2000)  # 爆炸年份
    fhour = ctypes.c_double(10)  # 爆点时间,小时:分钟:秒
    fminute = ctypes.c_double(20)  # 爆炸时间,分钟
    fsecond = ctypes.c_double(0)  # 爆点时间,秒
    calculate=dll.res(fW, fH, fD, fH0, fT, fLat, fLon, fmmdd, fyyyy, fhour, fminute, fsecond, fPhi0)

你可能感兴趣的:(python、c++混合编程)