`
chenqiang5206
  • 浏览: 33278 次
  • 性别: Icon_minigender_1
  • 来自: 江西
社区版块
存档分类

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

    博客分类:
  • c++
c++ 
阅读更多

1. 什么是动态链接库

 A dynamic library consists of routines that are loaded into your application at run time. When you compile a program that uses a dynamic library, the library does not become part of your executable — it remains as a separate unit.

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

使用动态链接库具有以下优点:(1) 隐藏源代码;(2)实现代码重用;(3)当程序调用DLL中的函数时不需要重新编译,提高编译速度;(4)当多个程序调用同一DLL中函数时,内存中只有一个副本,节省内存空间;(4)可通过替换DLL来实现程序的维护和升级。

当在应用程序中加载DLL时,有两种方法来调用导出的DLL函数,它们分别为加载时动态链接和运行时动态链接。

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

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

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

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

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

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

 

2.  创建动态链接库

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


 

2.2 Application type设置为Dll,勾选Empty project,单击Finish按钮。

 

2.3 新建myDllTest.h文件,内容如下:

#ifndef MY_DLL_TEST_H

#define MY_DLL_TEST_H

 

#ifdef EXPORTING_DLL

#define API_TYPE __declspec(dllexport)

#else

#define API_TYPE __declspec(dllimport)

#endif

 

API_TYPE double my_add(double x, double y);

API_TYPE double my_subtract(double x, double y);

API_TYPE double my_times(double x, double y);

 

#endif

 

2.4 新建myDllTest.h文件,内容如下:

#include "myDllTest.h"

#define EXPORTING_DLL

double my_add(double x, double y)

{

      return x + y;

}

 

double my_subtract(double x, double y)

{

      return x - y;

}

 

double my_times(double x, double y)

{

      return x * y;

}

 

2.5 分别在Debug和Release模式下编译,这时在文件夹myDllTest\Debug和myDllTest\Release内都有myDllTest.dll和myDllTest.lib文件,将myDllTest\Debug里面的myDllTest.lib重新命名为myDllTestd.lib。只需保留myDllTest\Release中的dll文件。

 

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

 

3. 使用加载时动态链接方式调用动态链接库

3.1 如果工程比较大,则可以在本地硬盘的其它位置新建一个文件夹,命名为myDllTest,再新建三个子文件夹bin,include和lib,将DLL文件放到bin中,H文件放到include中,LIB文件放到lib中。然后打开环境变量编辑器(在开始里面直接输入编辑系统环境变量,然后搜索即可)。新建环境变量myLibTest,变量值为myDllTest文件夹所在目录。然后编辑Path环境变量,添加语句%myDllTest%\bin;(不同的语句用;间隔)。

 

3.2  打开Visual Studio 2008,Tools -> Options -> Projects and Solutions -> VC++ Directories,在右端的Show directories for下拉列表中选择Include files,添加记录$(myDllTest)\include。然后选择Library files,添加记录$(myDllTest)\lib。单击OK按钮,然后重启电脑。

 工程比较小时,可将DLL,H和LIB文件直接复制到当前工程下,不需要添加环境变量。这时在包含对应头文件时应当使用双引号而不是尖括号。

 

3.3  新建一个工程,此处假设为Win32 Console Application,新建文件main.cpp,内容如下:

 #include <iostream>

#include <myDllTest.h>

 

using namespace std;

 

#ifdef _DEBUG

#pragma comment(lib, "myDllTestd.lib")

#else

#pragma comment(lib, "myDllTest.lib")

#endif

 

int main(int argc,char **argv)

{

    

     double x = 2.5;

     double y = 1.7;

 

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

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

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

 

     return 0;

}

也可以在Project -> Properties中添加相应的Additional Dependences,如下所示。Debug模式下添加Debug模式下编译的LIB文件,Release模式下添加Release模式下编译的LIB文件。

 

3.4 按下快捷键Ctrl+5,编译程序,输出以下结果。

 

注1:生成应用程序后,把所需要的DLL文件复制到程序所在目录下。否则会出现以下错误。

分享到:
评论

相关推荐

    VS2008静态库和动态库的创建和调用

    VS2008静态库和动态库的创建和调用是指在VS2008中创建和使用静态库和动态库的过程。静态库是一种编译后生成的库文件,可以被多个工程使用,而动态库则是一种在运行时加载的库文件,提供了更多的灵活性。 静态库的...

    静态、动态链接库的创建和调用

    调用动态链接库时,可以根据需要选择是使用运行时动态链接还是加载时动态链接。无论是哪一种方式,都需要确保程序中能够正确找到并引用到DLL的函数。 总的来说,静态链接库和动态链接库各有优缺点,它们在不同的...

    C# dll的调用(动态链接库创建与使用)

    本文将深入探讨C#中如何创建、使用DLL以及动态链接库的工作原理。 首先,我们要理解什么是DLL。DLL本质上是一些预先编译好的函数和类的集合,它们以库的形式存储,可以在运行时被多个程序加载。这不仅减少了磁盘...

    在VS2010中创建和调用动态链接库 教程和VS2010工程.rar

    本教程将深入探讨如何在VS2010中创建和调用动态链接库,以及如何通过实际工程案例进行操作。 首先,我们需要理解DLL的基本概念。DLL文件包含可执行代码和数据,可以在运行时被多个进程加载。与静态链接库(.lib)...

    vc++如何创建和调用动态库

    本文将详细介绍在Visual C++ (VC++) 环境下创建和调用动态链接库的方法。 #### 静态链接库与动态链接库的区别 1. **静态链接库**:lib中的指令会被直接包含在最终生成的可执行文件(EXE)中。这意味着程序运行时...

    如何创建动态链接库和调用动态链接库(入门教程)

    本文主要介绍了如何在Windows环境下使用Visual Studio 2005创建和调用动态链接库(DLL)。动态链接库允许程序代码和数据的共享,常用于模块化程序设计,它可以被多个应用程序或另一个动态链接库调用。文章内容包括...

    使用Inno setup 制作安装包 安装包脚本调用动态链接库实现特殊处理

    本篇将深入探讨如何利用Inno Setup来制作安装包,并通过安装脚本调用动态链接库(DLL)以实现特定功能。 一、Inno Setup基础 Inno Setup是一个开源的安装包制作工具,它支持创建自解压可执行文件、传统安装程序和...

    vs2017 C++动态链接库的创建和调用(隐式)

    vs2017 C++动态链接库的创建和调用,在VS2017下创建C++动态库(编译时去掉预编译头),把.h ,lib文件拷入新建测试工程目录下并添加到该工程中,dll文件加到运行目录下

    隐式的调用动态链接库

    总结,隐式调用动态链接库是Windows编程中的常见技术,它通过编译器和链接器在编译阶段完成函数地址的解析,简化了调用过程。在VC6环境中,通过设置导出和导入属性,以及正确配置项目链接,我们可以轻松地实现隐式...

    C#调用动态链接库的几个方法

    在C#中调用动态链接库(DLL)是常见的操作,...以上是C#调用动态链接库的一些主要方法和技术,每种方法都有其适用场景,选择哪种方法取决于具体的需求和DLL的特性。在实际开发中,应根据项目的具体需求灵活运用这些技术。

    LabVIEW调用动态链接库DLL详细介绍(包会) .txt

    ### LabVIEW调用动态链接库DLL详解 #### 一、前言 在现代软件开发过程中,经常需要将一些复杂的功能封装成独立的模块或者库,以便于复用和维护。对于LabVIEW这样的图形化编程环境而言,能够有效地调用外部的动态...

    创建和使用动态链接库 (C++)C#调用

    下面将详细讲解如何创建C++动态链接库以及在C#中进行调用。 1. **创建C++动态链接库** 创建C++ DLL通常分为以下步骤: - **设置项目属性**:在Visual Studio中,新建一个C++ Win32项目,选择“DLL”作为项目...

    动态链接库的建立与调用

    ##### 隐式调用动态链接库 隐式调用DLL的方式相对简单,只需在调用DLL的程序中声明相应的导入函数,并在链接时指定相应的导入库即可。例如,在`CallDll.cpp`中,我们声明了`Add()`和`Sub()`函数,并在主函数中调用了...

    vs2010 如何让创建和使用动态链接库(dll)

    一、创建动态链接库项目: 1、打开Microsoft Visual Studio 2010,选择File-&gt;New-&gt;Project。 2、在New Project中选择Installed Templates-&gt;Visual C++-&gt;Win32。 3、选择Win32 Console Application,设置名称:...

    linux创建和使用动态链接库.so文件

    ### Linux 创建和使用动态链接库 .so 文件 在 Linux 系统中,动态链接库(Dynamic Link Library,简称 DLL)通常以 `.so` 文件的形式存在,即 Shared Object 文件。动态链接库可以被多个程序共享使用,有助于减少...

    动态链接库的创建和调用

    在本示例中,我们将探讨如何使用Visual Studio 2010创建一个C++动态链接库,并在VB.NET项目中调用该库中的函数。 首先,我们创建DLL项目。在VS2010中,选择“文件”&gt;“新建”&gt;“项目”,然后选择“Visual C++”&gt;...

    Java调用动态链接库(Java 调用 DLL)

    Java调用动态链接库(DLL)是Java编程中一个比较特殊的技术,主要涉及到Java与本地代码的交互。在Windows系统中,DLL(Dynamic Link Library)是实现函数复用的一种方式,它包含了一系列可供其他程序调用的函数或数据...

    vs2010创建和使用动态链接库(dll)

    在Windows平台上,动态链接库(DLL)是一种共享代码和资源的机制,允许多个应用程序同时使用同一段代码,节省内存并方便代码更新。本教程将详细讲解如何在Visual Studio 2010环境下创建和使用DLL。 一、创建DLL项目...

    java调用动态链接库实例 java调用动态链接库实例 java调用动态链接库实例

    下面我们将详细讨论如何在Java中调用动态链接库,并以Linux环境下的SO库为例,提供一个实例。 1. **Java Native Interface (JNI)**: JNI是Java平台的标准组成部分,它允许Java代码和其他语言写的代码进行交互。JNI...

Global site tag (gtag.js) - Google Analytics