当前位置:文档之家› C++动态链接库解析

C++动态链接库解析

C++动态链接库解析
C++动态链接库解析

我学院网https://www.doczj.com/doc/d010894289.html,

C++动态链接库解析

一,动态链接库的基本概念

1.DLL(Dynamic Linker Library)的概念

可以把DLL看做是一个仓库,它提供了一些可以直接拿来用的变量,函数或者类(但是不建议从DLL中获取变量),在历史的发展中,仓库经历了从“无库- 静态链接库- 动态链接库”的时代。

静态链接库(.lib)和动态链接库(.dll)都是共享代码的方式。如果采用了静态链接库,则无论你愿不愿意lib中的代码指令都被直接包含进了最终生成的.exe程序中。但若是使用了动态链接库,该DLL则不会被包含进.exe程序中,当.exe程序执行的时候,再“动态”的来引用或者卸载DLL。

2.动态链接库的特点

DLL文件可以被其他的语言所调用,例如C#或者Java等。

譬如Window下的存在大量的DLL文件,当我们用Java编写Swing界面或者其他语言如C#等都是可以进行调用的。

3.常见的动态链接库

我学院网https://www.doczj.com/doc/d010894289.html,

我们在Window系统下面的system32文件夹中会看到kernel.dll、user32.dll和gdi32.dll。Window系统下的大多数API都是包含在这些DLL中。

kernel.dll中的函数主要处理内存管理和进程的调度。

user32.dll中的函数主要控制用户界面。

gdi32.dll中的函数主要负责图形方面的操作。

4.静态链接库和动态链接库的调用说明

?从上图中可以看出,静态链接库和动态链接库都是在程序的“链接”阶段进行调用的,但是静态库和动态库的链接方式是不一样的。

?静态库的链接是把.lib的代码指令全部链接到最终生成的EXE程序中。

?动态链接库的链接是只链接.dll文件的地址引用,因此生成的EXE程序中不包含.dll 的代码指令,所以.dll生成的可执行程序要比.lib生成的小很多,根据实验,一个仅包含printf的函数的生成程序,在静态链接库中需要800k,而动态链接库只需要8k左右,可以见其差100倍。

我学院网https://www.doczj.com/doc/d010894289.html, 二,静态库的创建和调用

1.静态链接库的创建

①创建一个Win32控制台应用程序

②点击下一步

我学院网https://www.doczj.com/doc/d010894289.html,

③选择静态库应用程序类型,去掉预编译和安全检查后,点完成。

我学院网https://www.doczj.com/doc/d010894289.html,

④项目创建完成后,添加MathUtils类

我学院网https://www.doczj.com/doc/d010894289.html,

⑤编写MathUtils类的.h和.cpp文件,为打包成静态库做准备

我学院网https://www.doczj.com/doc/d010894289.html,

⑥编写完成后,点击生成程序即可,然后在Debug目录下就会出现.lib程序

2.静态链接库的调用

我学院网https://www.doczj.com/doc/d010894289.html,

①按照上面的方式再创建一个项目,这里起名为TestLibDemo,注意这里的程序类型是控制台应用程序。然后编写main.cpp文件。

②静态连接库的调用需要引入.h文件和.lib文件,因此我们把上面创建的MathUtils项目里的MathUtils.h和MathUtils.lib文件复制到TestLibDemo项目的文件夹下面,lib文件放在lib文件夹下

我学院网https://www.doczj.com/doc/d010894289.html,

③在main.cpp中引入MathUtils.h头文件,并编写测试用例

④我们发现我们可以调用这些方法,但是却无法创建,这是因为我们只引入了头文件,并没有指定lib文件的位置和要链接的lib文件,所以需要我们在程序“链接”过程中将.lib文件包含到程序中。首先选中项目后右击项目点击“属性”,在“链接器- 常规- 附加库目录”这个选项里,将我们放置lib文件的目录指定出来。然后点击“输入- 附加依赖项”将MathUtils.lib添加进入就可以了。

我学院网https://www.doczj.com/doc/d010894289.html,

我学院网https://www.doczj.com/doc/d010894289.html,

⑤然后再重新运行测试程序就可以执行了

我学院网https://www.doczj.com/doc/d010894289.html,

⑥还有一种非配置项目的方式链接lib文件,我们在配置好lib文件所在的目录后,可以在代码中指定要引入的静态库文件,但是要先把上面的附加依赖项里已经引入的lib文件去掉。

我学院网https://www.doczj.com/doc/d010894289.html,

3.静态链接库的总结

在创建静态连接库的时候,需要注意要创建的是静态库程序,而非其他应用程序。

在调用静态链接库的时候,需要准备的是头文件(.h)和静态库文件(.lib),缺一不可。然后把头文件和静态库文件放到项目的目录下,在编辑器中,在测试项目的链接器的输入栏中,指定要加载lib文件的目录。在引用lib的时候有两种,一种是编辑器方式设置,另一种是在代码中设置。

三,动态链接库的创建和调用

1.动态链接库的创建

①新建项目,这里的应用程序类型选择dll程序,选择导出符号,这样会默认为我们创建模板。

我学院网https://www.doczj.com/doc/d010894289.html,

②创建完成后的项目给我们包含了示例代码,包含了导出变量,导出函数,导出类。

我学院网https://www.doczj.com/doc/d010894289.html,

③我们生成项目,就可以在项目下找到MyDLL.dll这个动态链接库文件。

2.动态库的调用

①我们新创建一个项目,名称为TestDLL,因为.dll是在运行时动态加载,所以需要把上一步产生的.dll文件拷贝到该运行程序的目录下。

②加载动态库,并获取动态库的函数的地址,并调用。

3.动态库的创建和调用总结

动态库的创建就是使用__declspce(dllexport)指令来进行导出,然后将该定义好的宏放到函数,变量或者类的前面,在预编译阶段,将宏进行替换。注意一点的是,我们在调用动态库的函数时候,通常会加上extern "C"这个指令,因为c++代码的函数有重载,会把函数的

我学院网https://www.doczj.com/doc/d010894289.html,

名称进行重新的替换,我们在加载动态库的时候倘若有重载就会找不到该函数,所以我们希望c++的函数以c的风格进行生成,就不会产生该问题。dllmain.cpp是dll文件的入口程序,主要处理多个.dll文件的时候用到,这里一般用不到。

动态库的调用我们采用的灵活的方式进行动态的“加载”和“卸载”,需要先引用window 的API,不要忘记释放动态库。

GCC常见错误解析

GCC常见错误解析 一、错误类型 第一类∶C语法错误 错误信息∶文件source.c中第n行有语法错误(syntex errror)。 这种类型的错误,一般都是C语言的语法错误,应该仔细检查源代码文件中第n行及该行之前的程序,有时也需要对该文件所包含的头文件进行检查。 有些情况下,一个很简单的语法错误,gcc会给出一大堆错误,此时要保持清醒的头脑,不要被其吓倒,必要的时候再参考一下C语言的基本教材。 第二类∶头文件错误 错误信息∶找不到头文件head.h(Can not find include file head.h)。 这类错误是源代码文件中的包含头文件有问题,可能的原因有头文件名错误、指定的头文件所在目录名错误等,也可能是错误地使用了双引号和尖括号。 第三类∶档案库错误 错误信息∶连接程序找不到所需的函数库,例如∶ld: -lm: No such file or directory. 这类错误是与目标文件相连接的函数库有错误,可能的原因是函数库名错误、指定的函数库所在目录名称错误等,检查的方法是使用find命令在可能的目录中寻找相应的函数库名,确定档案库及目录的名称并修改程序中及编译选项中的名称。第四类∶未定义符号 错误信息∶有未定义的符号(Undefined symbol)。 这类错误是在连接过程中出现的,可能有两种原因∶一是使用者自己定义的函数或者全局变量所在源代码文件,没有被编译、连接,或者干脆还没有定义,这需要使用者根据实际情况修改源程序,给出全局变量或者函数的定义体;二是未定义的符号是一个标准的库函数,在源程序中使用了该库函数,而连接过程中还没有给定相应的函数库的名称,或者是该档案库的目录名称有问题,这时需要使用档案库维护命令ar检查我们需要的库函数到底位于哪一个函数库中,确定之后,修改gcc 连接选项中的-l和-L项。 排除编译、连接过程中的错误,应该说这只是程序设计中最简单、最基本的一个步骤,可以说只是开了个头。这个过程中的错误,只是我们在使用C语言描述一个算法中所产生的错误,是比较容易排除的。我们写一个程序,到编译、连接通过为止,应该说刚刚开始,程序在运行过程中所出现的问题,是算法设计有问题,说得更玄点是对问题的认识和理解不够,还需要更加深入地测试、调试和修改。一个程序,稍为复杂的程序,往往要经过多次的编译、连接和测试、修改。 二、常见错误信息解析与处理 1

简述通过Java解析HTML文档

简述通过Java解析HTML文档 简述通过Java解析HTML文档 2011-04-01 09:14:05 摘要JAVA 语言是目前Internet 上大型的WEB 应用程序开发时使用得最热门的编程语言,本文从实践的角度重点阐述Java 语言中输入流类StreamTokenizer 在编写HTML 文件分析程序中的应用。关键词:java html StreamTokenzer HtmlTokenizer Applet 计算机 摘要JAVA语言是目前Internet上大型的WEB应用程序开发时使用得最热门的编程语言,本文从实践的角度重点阐述Java语言中输入流类StreamTokenizer在编写HTML文件分析程序中的应用。 关键词:java html StreamTokenzer HtmlTokenizer Applet 计算机信息技术已经渗透到人们生活的方方面面,网络信息已成为我们日常信息主要来源之一。而这些信息时如何在这神奇的网络上体现出的呢,这些网站是如何用机器语言编辑的等等。弄明白这些的方法很多,在这将通过java简单解析html文件,并举实例进行说明。

1 Java语言的概述 1.1 Java语言的主要特点 Java语言是一种适用于网络编程的语言,它的基本结构与 C++极为相似,但却简单得多。它集成了其它一些语言的特点和优势,又避开了它们的不足之处。Java的主要特点有:简单性、平台独立性、面向对象的技术、多线程、动态性、安全性、高性能、分布性、强大性、解释性、可移植性等。 1.2 Java解析Html工具 Java HTML Parser提供了一组Tag对象,这些对象可以深入解析一棵可搜索的结构树。 HtmlRipper是一个Java包能够按照预先定义好的规则设置来从Web页中抽取动态数据. Cobra是一个HTML工具包。它包含一个纯Java HTML DOM 分析器和一个页面表现引擎。Cobra支持 HTML4,Javascript 和CSS2。 Java Mozilla Html Parser能够将html解析成Java Document对象。它是一个基于Mozilla Html解析器封装的Html解析类库。因此能够为开发人员提供一个浏览器质量的HTML解析器。 1.3 Java Applet 通常翻译为Java小应用程序,也称Java小程序,它不是能独立运行的Java程序,而是通过支持Java浏览器来运行的

前端面试题大全(html篇)

HTML是一种基本的WEB网页设计语言,XHTML是一个基于XML的置标语言。最主要的不同: (1)XHTML元素必须被正确地嵌套 (2)XHTML元素必须被关闭 (3)XHTML标签名必须用小写字母 (4)XHTML文档必须拥有根元素 2.什么是语义化的HTML html5的语义化是指用正确的标签包含正确的容,比如nav标签就应该包含导航条容 (1)直观的认识标签对于搜索引擎的抓取有好处,用正确的标签做正确的事情! (2)html语义化就是让页面的容结构化,便于对浏览器、搜索引擎解析 (3)在没有CCS样式情况下也以一种文档格式显示,并且是容易阅读的。搜索引擎的爬虫依赖于标记来确定上下和各个关键字的权重,利于SEO。 (4)使阅读源代码的人更容易将分块,便于阅读维护理解。 写一段语义的html代码(HTML5中新增加的很多标签如: