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!!!

     

  • 相关阅读:
    SQL Server 在多个数据库中创建同一个存储过程(Create Same Stored Procedure in All Databases)
    SQL Server 多实例下的复制
    SQL Server 批量主分区备份(Multiple Jobs)
    SQL Server 批量完整备份
    SQL Server 游标运用:鼠标轨迹字符串分割
    SQL Server 批量主分区备份(One Job)
    SQL Server 即时文件初始化
    (原+转)Ubuntu中设置程序可用的cpu核心
    (原)Non-local Neural Networks
    (原)softmax loss特征为何径向放射状分布(直观理解,非公式推导。。。)
  • 原文地址:https://www.cnblogs.com/yukun/p/1662518.html
Copyright © 2011-2022 走看看