该记录仅作为学习参考,记录学习过程中遇到的问题,以及解决办法。
step1 建立DLL项目,结构如下:
test/
----mydll.h
----mydll.c
头文件mydll.h
#ifndef _MY_DLL_H
#define _MY_DLL_H_
#ifdef __cplusplus
extern "C" {
#endif
extern __declspec (dllexport) int add_range (int, int);
extern __declspec (dllexport) double average (int*, int);
#ifdef __cplusplus
}
#endif
#endif // ~_MY_DLL_H_
C文件:mydll.c
#include "mydll.h"
// __declspec (dllexport)
int add_range (int _sta, int _end) {
int res = 0;
if (_sta > _end)
return 0x7fffffff;
for (; _sta != _end; _sta ++) {
res += _sta;
}
return res;
}
// __declspec (dllexport)
double average (int* _arr, int _cnt) {
double res = 0.0;
int i = 0;
if (_cnt <= 0)
return (double) (~0);
for (; i < _cnt; i ++)
res += _arr [i];
return (double) (res /= _cnt);
}
step2 编译,链接
#打开命令行,进入我们的项目路径中:
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
下载与安装:https://www.cnblogs.com/ggg-327931457/p/9694516.html
*注意:
1.下载器下载很有可能无法在线下载,可以在上述链接中最后找到解决办法:下载正确离线包。
2.下载时默认源可能没法用,注意换源(就在下载页面的problems链接里),我试的University of Kent的源还不错。
编译生成动态链接库DLL:
还是用32位mingw使用的代码,但是注意编译命令不同:
- x86_64-w64-mingw32-gcc -c -DBUILD_DLL mydll.c
- x86_64-w64-mingw32-gcc -shared -o mydll.dll mydll.o -Wl,–kill-at,–out-implib,libmydll.a
- x86_64-w64-mingw32-gcc -m64 test.c mydll.dll(或者用python,见test.py)
test.c
int main (int argc, char* argv []) {
int res = add_range (10, 200);
printf ("%d\n", res);
int a[5] = {1,2,3,4,5};
/* double res1 = average(a, 3); */
/* printf ("%g\n", res1); */
printf("%g\n", average(a, 5));
return 0;
}
test.py
import ctypes
mydll = ctypes.windll.LoadLibrary("mydll.dll")
print(mydll.add_range(10,200))