惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
M
MIT News - Artificial intelligence
MyScale Blog
MyScale Blog
博客园_首页
G
Google Developers Blog
博客园 - 【当耐特】
美团技术团队
博客园 - 聂微东
Stack Overflow Blog
Stack Overflow Blog
Vercel News
Vercel News
小众软件
小众软件
博客园 - 司徒正美
雷峰网
雷峰网
T
Tailwind CSS Blog
V
V2EX
博客园 - 三生石上(FineUI控件)
F
Fortinet All Blogs
罗磊的独立博客
量子位
P
Proofpoint News Feed
Microsoft Azure Blog
Microsoft Azure Blog
月光博客
月光博客
A
About on SuperTechFans
Hugging Face - Blog
Hugging Face - Blog

博客园 - 枫崖

操作系统引导 win7 安装arcgis后出现问题解决方案 VS2010 MSDN VIM 入门(转载) Visual Studio 2010 添加vim支持 删除svn版本信息 - 枫崖 - 博客园 ArcGIS Server中创建ao对象的CLSID如何获得 有关IHttpModule与页面的执行顺序 使用python查询中文汉字的Unicode C++中动态链接库的一些概念及入门(2) Ubuntu 系统下终端快捷键设置 配置MapServer出现的一些问题及解决办法 yyyy-MM-dd日期正则表达式 未能加载文件或程序集“***”或它的某一个依赖项。拒绝访问。 mssql中sp_executesql和Exexute Win7 打开或关闭Windows功能 窗口空白 解决方案(转载) SQL Server 2008除去更新表失败的提示框 arcgis server 中使用iframepa包含地图页面 - 枫崖 对于将javascript嵌入到程序集中
C++中动态链接库的一些概念及入门(1)
枫崖 · 2010-02-03 · via 博客园 - 枫崖

   C++中的动态链接库说简单点也就是函数类库,大都以dll为后缀,和.net的程序集采用同样的后缀,但是比起.net中调用和编写就要麻烦很多,其中有一些概念需要了解清楚才能更好的去理解和使用动态链接库:

一、概念介绍

   首先要了解静态库和动态库的区别:

静态库:函数和数据被编译成一个lib文件,在编译和链接可执行文件时,链接器从库中复制这些函数和数据并把它们和应用程序的其他模块组合起来创建最终的可执行文件。

动态库:使用动态库的时候,需要2个文件,一个引入库文件(*.lib)和一个DLL(.dll)文件。这里也是以lib为后缀,但是这个引入库的lib文件和静态库的lib文件完全不是一回事。引入库的lib文件包含该dll导出的函数和变量的符号名,而dll文件包含该dll实际的函数和数据。如果使用动态库作为函数类库,在编译链接可执行文件时,只需要这个库的引入库lib文件,该DLL不复制到可执行文件中。直到可执行程序运行时,才去加载dll。

  ps:因此使用dll的话,dll可以不需要,只需要lib文件,运行时lib文件可以不要,但是dll文件需要

二、如何编写静态库

1、新建一个工程,选择"Win32 Static Library”,这里名称取为StaticLib

image

建好工程,我们编写自己的函数库,这里用于熟悉dll的写法及调用,做一个加法函数add

     1、新建一个c++文件

代码如下,很一般的C++代码

#include "stdafx.h"

int add(int x,int y)
{
    return x+y;
}

函数写好了,编译链接Build生成lib文件(即静态库文件)

     2、建立客户端程序使用这个静态库

          新建一个控制台应用程序,取名为ClientApp,这里我们需要调用StaticLib的add函数,所以我们需要声明那个函数,使用extern关键字对这个函数进行作用范围的扩大

      在ClientApp.cpp中添加函数签名

      extern int add(int x,int y);

     然后我们在main函数中如我们自己在这个工程下写的这个add函数一样像add(5,4)这样的方式来调用它,完整的ClientApp.cpp代码如下:

#include "stdafx.h"
#include "stdio.h"
extern int add(int x,int y);
int main(int argc, char* argv[])
{
    int a=add(5,4);
    printf("result:%d\n",a);

    return 0;
}

好,编译一下,很兴奋:0 error(s),0Warning(s)

image

然后Build一下,沮丧的事情发生了,连接出现错误了error LNK2001: unresolved external symbol "int __cdecl add(int,int)" (?add@@YAHHH@Z)

image

前面的StaticLib生成的lib文件在我们客户端程序中只是简单的做了个extern函数声明,可是真正函数实现ClientApp到哪里去找呢?链接的时候不知道,这里有两种方式解决:

   办法1、在ClientApp.cpp中添加导入库代码:#pragma comment(lib,"..\\debug\\vcdll.lib")

   办法2、或者在工程链接的时候添加这个库的链接选项,具体设置在菜单Projects-Setting,选中ClientApp这个工程,再选中Link选项卡

image

设置好后,重新生成,通过,运行结果如下

image 

一切那么美妙,按照我们预想的输出了。

本想做一个篇幅讲的,介于太长,下篇介绍动态库的编写及调用

Technorati 标签: dll,动态链接库,入门,调用