将LIB中的代码加入目标模块(EXE或者DLL)文件中
Posted chenmrs
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将LIB中的代码加入目标模块(EXE或者DLL)文件中相关的知识,希望对你有一定的参考价值。
动态链接库英文为DLL,是Dynamic Link Library的缩写。DLL是一个包含可由多个程序,同时使用的代码和数据的库。
当程序使用 DLL 时,具有以下的优点: 使用较少的资源,当多个程序使用同一个函数库时,DLL 可以减少在磁盘和物理内存中加载的代码的重复量(运行时需要的库是需要加入内存的)。
.h和.cpp编译后会生成.lib和.dll 或者 .dll 文件
我们的程序引用别的文件的函数,需要调用其头文件,但是头文件找到相应的实现有两种方式,一种是同个项目目录下的其他cpp文件(公用性差),一种是链接时的lib文件(静态,lib中自己有实现代码),一种是运行时的dll文件,一种是lib和dll 的结合(动态,lib放索引,dll为具体实现)
还要指定编译器链接相应的库文件。在IDE环境下,一般是一次指定所有用到的库文件,编译器自己寻找每个模块需要的库;在命令行编译环境下,需要指定每个模块调用的库。
一般不开源的系统是后面三种方式,因为可以做到接口开放,源码闭合
静态链接库
静态链接库(Static Libary,以下简称“静态库”),静态库是一个或者多个obj文件的打包,所以有人干脆把从obj文件生成lib的过程称为Archive,即合并到一起。比如你链接一个静态库,如果其中有错,它会准确的找到是哪个obj有错,即静态lib只是壳子,但是静态库本身就包含了实际执行代码、符号表等等。
如果采用静态链接库,在链接的时候会将lib链接到目标代码中,结果便是lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。
这个lib文件是静态编译出来的,索引和实现都在其中。
静态编译的lib文件有好处:给用户安装时就不需要再挂动态库了。但也有缺点,就是导致应用程序比较大,而且失去了动态库的灵活性,在版本升级时,同时要发布新的应用程序才行。
动态链接库(DLL)
.dll + .lib : 导入库形式,在动态库的情况下,有两个文件,而一个是引入库(.LIB)文件,一个是DLL文件,引入库文件包含被DLL导出的函数的名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到所需要使用的DLL文件,库中的函数和数据并不复制到可执行文件中,因此在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中所要调用的函数的内存地址,这样当一个或多个应用程序运行是再把程序代码和被调用的函数代码链接起来,从而节省了内存资源。
从上面的说明可以看出,DLL和.LIB文件必须随应用程序一起发行,否则应用程序将会产生错误。
.dll形式: 单独的可执行文件形式,因为没有lib 的静态载入,需要自己手动载入,LoadLibary调入DLL文件,然后再手工GetProcAddress获得对应函数了,若是java 会调用System的LoadLibary,但是也是调用JVM中对于操作系统的接口,使用操作系统的LoadLibary等方法真正的将.dll读入内存,再调用生成的相应函数。
.dll+ .lib和.dll本质上是一样的,只是前者一般用于通用库的预设置,是的我们通过lib直接能查询到.dll文件,不用我们自己去查询,虽会消耗一部分性能,但是实用性很大。.dll 每一个需要到的文件都需自己调用加载命令,容易出错与浪费较多时间(但是我们测试时却可以很快的看出功能实现情况,而且更灵活地调用)
以上是关于将LIB中的代码加入目标模块(EXE或者DLL)文件中的主要内容,如果未能解决你的问题,请参考以下文章