python引用C++ DLL文件若干解釋及示例
首先說一下,python不支持C++的DLL,但是支持C的DLL;C++因爲和C兼容可以編譯爲C的DLL,這是下面文章的背景與前提
首先我這兒的示例使用VS2017編譯的DLL,先講過程,再解釋
第一步,新建DLL項目
確定之後我們可以看到默認的文件
這時候我們需要新建一個與Test.cpp對應的頭文件
這是完成之後的代碼結構
下面是Test.h文件的內容和Test.cpp文件的內容及相應解釋
// Test.cpp : 定義 DLL 應用程序的導出函數。
//
#include "stdafx.h"
#include "Test.h"
bool Test1()
{
return true;
}
bool Test2()
{
return false;
}
首先我們需要引用Test.h,也就是我們剛剛建立的與之匹配的頭文件
Test1和Test2就是我們寫的python需要調用的函數,因爲python在調用DLL時除了int型其他的返回類型都需要指定,所以我用bool來展示
//Test.h
#pragma once
extern "C" __declspec(dllexport) bool Test1();
extern "C" __declspec(dllexport) bool Test2();
這是我們建立的頭文件
第一行VS自動生成,不用管它,它的作用是保證頭文件只被編譯一次
第二行和第三行就是我們要添加的代碼,這兩行就是我們定義的函數,有點像以前學C語言的時候老師說的定義在main函數後面的函數要在前面先寫一次,記住這個形式就好了。我來講講前面的代表什麼意思
- extern “C”
這個的意思是聲明的函數可以被其他模塊調用,並且編譯爲C文件
- __declspec(dllexport)
這是MS VC中專用的關鍵字,表示將函數、類等聲明爲導出函數,供其他程序調用
這兩個加起來添加到頭文件裏,聲明的函數編譯出來就可以被python調用了
python調用方法也很簡單
from ctypes import *
dll = CDLL("Test.dll")
dll.Test1.restype = c_bool
# restype是函數的返回類型,c_bool代表返回bool類型,這裏的對應關係就自己查一下了
# 除了restype還有argtypes,代表函數的參數類型
print(dll.Test1())
整體大致就是這樣了,如果沒成功可以給我留言看看,我也是個新手,最近因爲一個項目纔用到Python,如果有什麼不對的請批評指正
關於ctypes的部分,主要參考了這篇博文,感謝”無盡的數字眩暈症“