這裡編寫個簡單例子來說明下具體是如何操作的:
建立dll專案,結構如下:
test/
----mydll.h
----mydll.c
標頭檔案:mydll.h
#ifndef __mydll_h__
#define __mydll_h__
#ifdef build_dll
#define dll_export __declspec(dllexport)
#else
#define dll_export __declspec(dllimport)
#endif
#ifdef __cplusplus
extern "c"
#endif
#endif // __mydll_h__
c檔案:mydll.c
#include "mydll.h"
dll_export int __stdcall foo(int x)
如果你安裝了code::blocks(和mingw),那麼建立環境變數:
mingw_home="c:\program files\codeblocks\mingw"
path=%mingw_home%\bin;%path%
開啟命令列,進入我們的專案路徑中:
d:\test>
#執行編譯命令
d:\test>mingw32-gcc -c -dbuild_dll mydll.c
#執行鏈結命令,生成mydll.dll和靜態庫檔案libmydll.a
d:\test>mingw32-gcc -shared -o mydll.dll mydll.o -wl,--kill-at,--out-implib,libmydll.a
以上,就是我們生成dll的全過程了。
用python測試下:
>>> import ctypes
>>> mydll = ctypes.windll.loadlibrary("d:\\test\\mydll.dll")
>>> print mydll.foo(10)
10mingw在vista中執行時cannot exec `cc1'問題:
假設環境變數path已經設定了mingw路徑為c:/mingw/bin;
但是在make時無法正確執行,出現:
g++: installation problem, cannot exec `cc1plus'
:no such file or directory
解決方法:
將c:/mingw//libexec/gcc/mingw32/
3.4.5/的 cc1和cc1plus兩個檔案
複製至c
:/mingw/bin
mingw在vista中執行時cannot exec `cc1』問題:
假設環境變數path已經設定了mingw路徑為c:/mingw/bin;
但是在make時無法正確執行,出現:
g++: installation problem, cannot exec `cc1plus』: no such file or directory
解決方法:
將c:/mingw//libexec/gcc/mingw32/3.4.5/的 cc1和cc1plus兩個檔案
複製至c:/mingw/bin
password.c
#include "password.h"
dll_export char* __stdcall foo(char *x)
temp[i]=*(x+i);
}temp[sizex]="\0";
return temp;
//return x;
}
password.h
#ifndef __password_h__
#define __password_h__
#ifdef build_dll
#define dll_export __declspec(dllexport)
#else
#define dll_export __declspec(dllimport)
#endif
#ifdef __cplusplus
extern
"c"
#endif
#endif // __password_h__
test.py
import os
import ctypes
from ctypes import c_char_p
deftests
(): os.chdir(r'c:\documents and settings\administrator\桌
面\2018-08-02')
pa=ctypes.windll.loadlibrary('password.dll')
print(pa.foo(c_char_p(b'abc')))
return pa
pa=tests()
print(pa.foo(c_char_p(b'abcd')))
rst=ctypes.string_at(pa.foo(c_char_p(b'abcd')),-1)
print(rst.decode('utf-8'))
python c模組擴充套件及PyIntObj物件
這是一篇 python原始碼剖析 的閱讀筆記。原始碼位置 python中一些模組是用c來實現的,所以我們也可以用c來實現一些自定義模組。在讀 python原始碼剖析 的過程中,使用一些自定義的模組可以很方便的了解其中一些原理,而不用每改一行 都得編譯整個python的原始碼。用c實現自定義模組的流程...
Python C擴充套件實踐 效能對比
因為效能等一些原因,希望用c來擴充套件python。有多種方法,例如 這裡闡述最後一種方式的實現。首先需要 include 需要實現下面三個函式 static pyobject funcname pyobject self,pyobject args 函式定義 static pymethoddef ...
c語言 python C語言和python的區別
python可以說是目前最火的語言之一了,人工智慧的興起讓python一夜之間變得家喻戶曉,python號稱目前最最簡單易學的語言,現在有不少高校開始將python作為大一新生的入門語言。本萌新也剛開始接觸python,發現python與其他語言確實有很大的區別。python是由c語言實現的,因此想...