zoukankan      html  css  js  c++  java
  • 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!!!

     

  • 相关阅读:
    多线程在javaweb中的应用
    Class类是什么? Class.forName()是干什么的?
    JDBC学习笔记
    jsp
    VMware虚拟机中red hat linux ping不通宿主物理主机原因
    数据库设计原则(装载)
    PHP实现正态分布的累积概率函数
    如何正确配置 Nginx + PHP ???
    PHP针对二维数组无限遍历变形研究
    easyui常用控件及参数说明
  • 原文地址:https://www.cnblogs.com/yukun/p/1662518.html
Copyright © 2011-2022 走看看