本篇主要讲两部分内容(最简单代码说明整个思路):
- 用eclipse+CRT编译适合Python调用的C/C++代码;
- 用eclipse+CRT+MinGW将代码编译成dll文件。
正文:
一 编写C++代码:
根据extern "C" {}是否在CPP中可以分如下三种情况:
(extern "C"{} 用法类似 ROBOT_LIBRARY_SCOPE = "GLOBAL",头文件类似:__init__.py。
extern "C" 详细解释清参考文章:https://www.cnblogs.com/rollenholt/archive/2012/03/20/2409046.html)
1.第一种情况:
extern "C" {}在CPP中(这个时候可以不用单独再建立头文件.h)代码如下:
原代码:
#include <stdio.h>
extern "C" {
__declspec(dllexport) int Double(int x);
__declspec(dllexport) float floatAdd(float a,float b);
__declspec(dllexport) void HelloWorld(char * str);
__declspec(dllexport) void Ints(int * arr,int n);
__declspec(dllexport) char charout(char a);
}
int Double(int x){
return x*2;
}
float floatAdd(float a,float b) {
return a+b;
}
char charout(char a){
return a;
}
void HelloWorld(char * str){
puts(str);
}
void Ints(int * arr,int n){
for(int i=0;i<n;i++){
printf("%d ",arr[i]);
}
puts("");
2.第二种情况:
extern "C" {}还是在CPP中,只不过每个函数都加上extern "C" 代码如下:
原代码如下:
#include <stdio.h>
extern "C" __declspec(dllexport) int Double(int x){
return x*2;
}
extern "C" __declspec(dllexport) float floatAdd(float a,float b) {
return a+b;
}
extern "C" __declspec(dllexport) char charout(char a){
return a;
}
extern "C" __declspec(dllexport) void HelloWorld(char * str){
puts(str);
}
extern "C" __declspec(dllexport) void Ints(int * arr,int n){
for(int i=0;i<n;i++){
printf("%d ",arr[i]);
}
puts("");
}
3.第三种情况:
extern "C" {}不在CPP中,而是在头文件中, 代码如下:
头文件(.h)是和CPP在同一级目录下(一般都在src目录下),关于头文件创建:选中src目录→鼠标右键→New→Header file(注意:填写file名字时一定要加上后缀.h)
头文件代码如下:
.CPP文件代码如下:
二、编译成dll文件:
手动配置编译信息步骤如下:
1.选择项目,鼠标右键,选择Properties:
点击Properties,会出现下图界面:
重点是Tool Chain Editor 和 Settings:
2.Tool Chain Editor中一般信息都是默认如下,不用怎么变动,如下图:
- Settings配置有如下几个地方,按截图配置就行:
Number1:
Number2:
图中所需内容:-Wl,--add-stdcall-alias -static-libgcc -static-libstdc++ -shared
Number3:
Number4:
有些地方说什么创建dll文件名字会自动改变啥的,引用时候是要在前面多加lib的,其实就是这个地方多了一个前缀,网上一些文章是不明所以的瞎说!
Number5:
Number 6:
完成上面Number1~6,之后,点击OK
然后再点击“”按钮,进行编译,编译成功后如图:
最后,鼠标选中该dll文件,鼠标左键长按,就可以拖动该文件到我们需要放dll文件的地方!了
参考文章1:https://blog.csdn.net/csdncqmyg/article/details/53170548
参考文章2:https://blog.csdn.net/Jul_11th/article/details/78621178
参考文章3:https://www.cnblogs.com/timssd/p/6698968.html