C++中动态链接库的一些概念及入门(2)

  上一篇讲述了动态链接库的一些概念及静态库的编写和调用,这篇会介绍到动态链接库dll的编写及调用。

一、建立dll工程

   仍然在上篇的基础上新建一个Project,类型为"Win32 Dynamic-link Library”,如图,工程名取名为DllLib

image

添加一个C++文件,取名为sub.cpp,这里添加一个函数用于做减法运算

int sub(int x,int y)
{
    return x-y;
}

原本以为编译链接生成DllLib.dll,DllLib.lib这两个文件,于是到这个工程的debug目录下,很奇怪没有找到那个引入库DllLib.lib文件,先不管它,仍然像上篇那样调用静态库那样调用这个sub方法,看结果如何。

二、调用自己编写的dll

  1、声明sub函数

  2、声明lib位置

     ClientApp.cpp代码如下

#include "stdafx.h"
#include "stdio.h"
extern int add(int x,int y);
extern int sub(int x,int y);
#pragma comment(lib,"..\\StaticLib\\debug\\StaticLib.lib")
#pragma comment(lib,"..\\DllLib\\debug\\DllLib.lib")
int main(int argc, char* argv[])
{
    int a=add(5,4);
    printf("result:%d\n",a);
    int b=sub(5,4);
    printf("sub result:%d\n",b);
    return 0;
}

编译没有问题,链接就出现错误:cannot open file "Debug/DllLib.lib",上面提到为什么生成dll时本来还有引入库文件没有生成。这就是动态库和静态库另外一个区别,对于动态链接库导出函数需要在函数前面添加__declspec(dllexport)这个关键字,将这个函数导出来。好了,重新生成DllLib工程发现其Debug目录下有了lib导入库文件。

image

nice,再回到ClientApp中重新编译链接没有错误,运行,预想的结果没有出现,出现下面错误提示框,why?

image

、刚刚生成的那个dll文件缺失,oh,原来编写的dll文件这个ClientApp找不到。

ps:windows程序运行时如何查找其所需要的dll,查找顺序如下:

      1、程序的执行目录(这里是D:\Code\Study\vc\DllStudy\ClientApp\Debug)

      2、当前目录

      3、系统目录

      4、path环境变量中所列的路径

因此我们将DllLib.dll拷贝到D:\Code\Study\vc\DllStudy\ClientApp\Debug下面,运行,ok!!!

 

posted @ 2010-02-03 11:16  枫崖  阅读(341)  评论(0编辑  收藏  举报