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