这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 使用VS2008创建和调用动态链接库

共1条 1/1 1 跳转至

使用VS2008创建和调用动态链接库

高工
2018-02-23 17:15:15     打赏
使用VS2008创建和调用动态链接库


1. 动态链接库的概念及优点

     动态链接库是一个函数和变量的集合,在调用它的程序运行时才被加载。因此,动态链接库和可执行程序是分离的。

     动态链接库具有以下优点:

        (1) 隐藏源代码;

        (2)实现代码重用;

        (3)当程序调用DLL中的函数时不需要重新编译,提高编译速度;

        (4)当多个程序调用同一DLL中函数时,内存中只有一个副本,节省内存空间;

        (5)可通过替换DLL来实现程序的维护和升级。

2.动态链接库加载的方法

    当在应用程序中加载DLL时,有两种方法来调用导出的DLL函数:加载时动态链接运行时动态链接

    在加载时动态链接中,应用程序像调用本地函数一样对导出的DLL函数进行显式调用。要使用加载时动态链接,请在编译和链接应用程序时提供头文件(.h)和导入库文件(.lib)。当您这样做时,链接器将向系统提供加载DLL所需的信息,并在加载时解析导出的DLL函数的位置。

    在运行时动态链接中,应用程序调用LoadLibrary函数或LoadLibraryEx函数以在运行时加载DLL。成功加载DLL后,可以使用GetProcAddress函数获得要调用的导出的DLL函数的地址。在使用运行时动态链接时,无需使用导入库文件。

    可以根据下面的 准则来判断使用哪一种链接方式。

  (1)启动性能 如果应用程序的初始启动性能很重要,则应使用运行时动态链接

  (2)易用性 在加载时动态链接中,导出的 DLL 函数类似于本地函数。这使您可以方便地调用这些函数。

  (3)应用程序逻辑 在运行时动态链接中,应用程序可以分支,以便按照需要加载不同的模块。在开发多语言版本时,这一点很重要。

3.创建动态链接库

  3.1 建立一个工程项目

      打开Visual Studio 2008,File -> New -> Project…,选择Win32 Console Application,Name设置为myDLLTest。

     next-> Application type->Dll,additional options->Empty project,单击Finish按钮。

  3.2  添加myDllTest.h文件     

[cpp] view plain copy
  1. <pre name="code" class="cpp">#ifndef MY_DLL_TEST_H  

  2. #define MY_DLL_TEST_H  

  3.    

  4. #ifdef EXPORTING_DLL  

  5. #define API_TYPE __declspec(dllexport)  

  6. #else  

  7. #define API_TYPE __declspec(dllimport)  

  8. #endif  

  9.    

  10. API_TYPE double my_add(double x, double y);  

  11. API_TYPE double my_subtract(double x, double y);  

  12. API_TYPE double my_times(double x, double y);  

  13.    

  14. #endif  


   3.3 添加myDllTest.cpp文件


[cpp] view plain copy
  1. #include "myDllTest.h"  

  2. #define EXPORTING_DLL  

  3. double my_add(double x, double y)  

  4. {  

  5.       return x + y;  

  6. }  

  7.    

  8. double my_subtract(double x, double y)  

  9. {  

  10.       return x - y;  

  11. }  

  12.    

  13. double my_times(double x, double y)  

  14. {  

  15.       return x * y;  

  16. }  

  17.    

   3.4 编译


myDllTest.dll,myDllTestd.lib,myDllTest.lib和myLibTest.h是我们最终交付给用户的文件。

加载时动态链接方式调用动态链接库   4.1 环境变量设置    如果工程比较大,则可以在本地硬盘的其它位置新建一个文件夹,命名为myDTest,再新建三个子文件夹bin,include和lib,将DLL文件放到bin中,H文件放到include中,LIB文件放到lib中。计算机->属性->高级系统设置->环境变量。在系统变量->新建->环境变量名myLibTest,变量值为myDTest文件夹所在目录;用户变量->编辑Path环境变量,添加myDTest中bin的路径;(不同的语句用;间隔)。   4.2 VS环境设置   工程比较小时,可将DLL,H和LIB文件直接复制到当前工程下,不需要添加环境变量。这时在包含对应头文件时应当使用双引号而不是尖括号。   4.3 新建调用动态库的工程    [cpp] view plain copy
  1. #include <iostream>  

  2. #include <myDllTest.h>  

  3. using namespace std;  

  4.    

  5. int main(int argc,char **argv)  

  6. {  

  7.       

  8.      double x = 2.5;  

  9.      double y = 1.7;  

  10.    

  11.      cout << x << " + " << y << " = " << my_add(x, y) << endl;  

  12.      cout << x << " - " << y << " = " << my_subtract(x, y) << endl;  

  13.      cout << x << " * " << y << " = " << my_times(x, y) << endl;  

  14.    

  15.      return 0;  

  16. }  

    4.4 环境设置    在Project -> Properties->configuration properties,C++ ->addtional include direction中添加include文件路径;link -> general ->Additional library Direction中添加lib的路径,在link->input->additional dependence。Debug模式下添加Debug模式下编译的LIB文件,Release模式下添加Release模式下编译的LIB文件。    4.5 运行     按下快捷键Ctrl+5,编译程序




共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]