Dev C++开发lib和dll

来源:互联网 发布:生产数据分析报告 编辑:程序博客网 时间:2024/06/16 06:00

下面通过例子简单介绍dev c++ 是如何开发lib和dll并使用的。关于dev c++ 我使用的版本是5.11,单击下载:

一、创建项目结构(文件夹)

为了使整个项目例子看起来比较易于管理,下面我们在D盘创建文件夹d:/gcc,在gcc文件夹里我们分别创建include和lib、dll文件夹。

运行:cmd

分别执行下面命令:

>d:

>mkdir gcc

>cd gcc

>mkdir include,lib,dll

如下图示:


二、创建lib项目(Dev C++制作)

打开Dev C++,打开File——>New——>Project,如下图示:


创建lib项目,并保持在d:/gcc/lib文件夹里。


可以看到d:/gcc/lib下有

myMath.dev文件是Dev C++管理项目的文件,是目录管理配置文件。

1)我们创建一个add.c文件,存储在lib里

#includeint add(int a,int b){return a + b;} 

2)创建myMath.h文件,存储在include里

extern int add(int a,int b);
3)编译后,在lib下看到了两个文件
.o文件是目标文件
.a文件就是lib文件
如下:

三、创建一个测试项目

创建test项目如下:


1)创建一个main.c文件如下:

#include #include #include int main(int argc, char *argv[]) {printf("%d",add(2,2));return 0;}
可以看到,在main.c源代码里用到了函数add,还导入了myMath.h头文件。
2)添加项目设置
如果不做这一步,编译会找不到add函数,所以这一要设置项目选项,添加myMath.h和add.a
如下:


3)编译运行



四、创建dll项目

1)创建dll
打开Dev C++,创建dll项目,如下:

创建后就有两个文件:dll.h和dllmain.c,dll.h文件就是说明文件,dllmain.c是源程序文件,其中我们删去多余的代码,如下:
#ifndef _DLL_H_#define _DLL_H_#if BUILDING_DLL#define DLLIMPORT __declspec(dllexport)#else#define DLLIMPORT __declspec(dllimport)#endifDLLIMPORT void HelloWorld();#endif
/* Replace "dll.h" with the name of your header */#include "dll.h"#include "stdio.h"#include DLLIMPORT void HelloWorld(){printf("hello world\n");}
编译生成dll文件,生成的文件以项目名称命名,为myString.dll。编译的时候会有警告,如下:

这个警告就是说没有调用dll的应用程序。而且给出了添加的方法,在Execute——>Paremeters指定。我们指定以上创建的test工程的main.c函数作为调用myString.dll的调用程序,再次编译就不会有这个警告了。如下设置:

编译后可以在dll的工程下看到如下:

其中myString就是我们要用的dll(动态链接库)。
2)使用dll
在test工程中的main.c里这样来使用myString.dll,如下:
#include #include #include #include int main(int argc, char *argv[]) {printf("%d\n",add(2,2));HelloWorld();getchar();return 0;}
从以上代码中看到有#include<dll.h>,所以要指定#include<dll.h>的路径和dll的路径,所以配置如下:


因为我们设置include是在D:\gcc\include下,所以讲dll.h复制进去。
然后再编译的时候clean一下,Execute——>clean。
3)只编译通过,看到生成test.exe
4)运行
双击test.exe出错,

找不到myString.dll,这时我们将myString.dll拷贝到test.exe同级目录下,双击执行如下:

这里有个问题需要思考:为什么编译的时候需要明确制定dll路径,而执行的时候就没有找到此路径呢?

五、例子下载

下载

六、a(lib)和dll的区别

在d盘随便新建一个文件,比如a,分别将myMath.a和myString.dll和test.exe拷贝到a文件夹里,双击执行test.exe,发现能执行。
将myMath.a删掉,再双击test.exe,发现还能执行。
再将myString.dll删掉,双击test.exe,发现报错

说明.a文件是编译后就已经在exe中,而dll中的函数不在exe中,需要执行exe时动态找到被执行。这就是.a和dll的区别。
.a称为静态库
dll称为动态链接库。