Codeblosks用C++编写通用DLL供其他语言调用
来源:互联网 发布:lifemod软件下载 编辑:程序博客网 时间:2024/06/11 23:36
这个问题纠结很久了,今天研究了好久,好像大概能写了。
先用Codeblosks建立DLL项目,用VS其实都是一样一样的
我们就写一个大数相加试试,main.h可以直接删掉,直接在main.cpp里面写下面的内容就行了
#include<string>#include<cstring>#include<algorithm>using namespace std;#define DLL _stdcallDLL char* Add(char* A, char *B) { int i = strlen(A), j = strlen(B); int t = 0, l = max(i, j), k = l; char *S = new char[l + 5]; while(i || j) { if(i) t += A[--i] - '0'; if(j) t += B[--j] - '0'; S[--k] = t % 10 + '0'; t /= 10; } if(t) { for(i = l - 1; i >= 0; i--) { S[i + 1] = S[i]; } S[0] = t + '0'; l++; } S[l] = 0; return S;}
给非C和C++语言调用要用stdcall约定,其实只要定义一个宏定义,然后在要允许外部调用的函数前面加上即可
codeblocks会在Debug里面生成dll和一个.def 文件,如下图
打开.def文件可以发现下面这些内容
EXPORTS _Z3AddPcS_@8 @1 _ZSt3maxIiERKT_S2_S2_ @2
然后_Z3AddPcS就对应了Add在DLL里面的名字,可以发现这个名字是乱码,我们先用易语言来调用测试下
然后就搞定了,那么DLL里面的名字非常乱,下面说下
首先,我们在自动生成的.def上面修改
EXPORTS add = _Z3AddPcS_@8 @1 _ZSt3maxIiERKT_S2_S2_ @2然后在codeblocks里面Settings->Compiler->Global compiler settings->Linker settings,点Add把那个.def添加进去
OK以后再编译一次,现在的DLL里的刚刚那个大数相加的函数对应的名字就是Add了,我们再试试
现在就完全搞定了。
有几个要注意的地方:
在生成DLL之前,要先把调用动态链接库的编译器关掉,假如如果是易语言的话,要先把易语言关掉才能生成,因为易语言会一直占用DLL
如果在DLL里面新增加了几个函数,但是最后编译出来不能调用,可能要先把Compiler里的那个.def删掉,然后再编译一次,让编译器自己生成
不过也遇到个问题,就是名字有可能会变化,不知道会不会出现改写好.def之后,函数的名字又变化
感觉也有可能是我没写好什么东西,也希望大神指点~
/************************************我是下划线*******************************************/
后来又改了一份代码,做个备份
#include<cstdio>#include<cstring>using namespace std;#define EPORT extern "C" _stdcall __declspec(dllexport)#define CPORT __declspec(dllexport)int max(int a, int b) { return a > b ? a : b;}EPORT char* Add(char* A, char *B) { int i = strlen(A), j = strlen(B); int t = 0, l = max(i, j), k = l; char *S = new char[l + 5]; while(i || j) { if(i) t += A[--i] - '0'; if(j) t += B[--j] - '0'; S[--k] = t % 10 + '0'; t /= 10; } if(t) { for(i = l - 1; i >= 0; i--) { S[i + 1] = S[i]; } S[0] = t + '0'; l++; } S[l] = 0; return S;}CPORT int main() { freopen("output.txt", "w+", stdout); printf("%s\n", Add("1243536542363", "45467586796523456466")); return 0;}
1 0
- Codeblosks用C++编写通用DLL供其他语言调用
- c#编写dll 供其他语言调用问题
- c编写dll供c#调用
- C语言生成DLL供C#调用
- C#编写dll库文件并注册为COM组件供其他语言(如PHP等)调用
- 调用C语言编写的DLL文件
- vc 编写dll 供java调用
- 编写DLL中调用其他DLL
- c/c++动态库(DLL)调用,c#等其他语言调用c/c++的DLL
- vc做的供其他语言调用的dll的例子 (传递的是字符串格式的参数)
- 在Delphi中调用C语言编写的DLL
- C#调用C语言编写的dll示例
- 如何用VC编写供JAVA调用的DLL
- 如何用VC编写供PB调用的DLL
- 如何用VC编写供PB调用的DLL (转)
- Visual C++ 编写供 VB.Net调用的Dll
- C语言编写DLL动态链接库并分别用VB和Python调用
- C生成DLL供C#或VB调用
- [Spring实战系列](11)SpEL使用表达式装配
- 例题6-7 UVa122 Trees on the level(树&&队列BFS&&sscanf字符串转整数)
- Codeforces 77C 树形DP
- Priest John's Busiest Day
- 第十章编程练习(7)
- Codeblosks用C++编写通用DLL供其他语言调用
- memset用法详解(转)
- Codeforces 55D 数位DP
- PAT_乙级1036
- js字符串方法(总结)
- 【URAL 刷题记】URAL 1028 ~ URAL 1035
- C#成神之路<13> C#对类的设计
- flush()
- Android Studio之提高编译的效率