下面通过例子简单介绍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里
#include
int 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)
#endif
DLLIMPORT 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是在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称为动态链接库。