c++中.dll与.lib文件的生成与使用的详解
两种库:
• 包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamic link library。
• 包含函数代码本身,在编译时直接将代码加入程序当中,称为静态链接库static link library。
共有两种链接方式:
• 动态链接使用动态链接库,允许可执行模块(.dll文件或.exe文件)仅包含在运行时定位DLL函数的可执行代码所需的信息。
• 静态链接使用静态链接库,链接器从静态链接库LIB获取所有被引用函数,并将库同代码一起放到可执行文件中。
两种文件的区别
使用lib需注意两个文件:
•.h头文件,包含lib中说明输出的类或符号原型或数据结构。应用程序调用lib时,需要将该文件包含入应用程序的源文件中。
•.LIB文件。
使用dll需注意三个文件:
•.h头文件,包含dll中说明输出的类或符号原型或数据结构的.h文件。应用程序调用dll时,需要将该文件包含入应用程序的源文件中。
•.LIB文件,是dll在编译、链接成功之后生成的文件,作用是当其他应用程序调用dll时,需要将该文件引入应用程序,否则产生错误(如果不想用lib文件或者没有lib文件,可以用WIN32 API函数LoadLibrary、GetProcAddress装载)。
•dll文件,真正的可执行文件,开发成功后的应用程序在发布时,只需要有.exe文件和.dll文件,并不需要.lib文件和.h头文件。
1.生成lib文件
首先,我们先建立一个控制台工程(新建->工程->控制台程序),添加sub.cpp以及sub.h文件。
//sub.h
#ifndef _SUB_H
#define _SUB_H
void sub(int a,int b);
#endif
//sub.cpp
#include "sub.h"
#include <iostream>
void sub(int a,int b)
{
std::cout<<(a-b)<<std::endl;
}
由于在工程中,没有main()函数,所以直接编译出错。这时,要右键点击工程,并选择工程属性,出现下图,选择静态链接库即可。
这时候再按F7,build solution即可产生lib文件。在Debug中只生成.lib文件。
2.生成dll文件
生成dll文件的过程与上面的过程是一样的,只是在选择Dynamic Library(.dll)即可。在Debug中会生成一个.lib和.dll两种文件。
3.两种文件的使用
在使用时,静态链接库只要把.h和.lib文件加入到工程文件夹中即可。而动态链接库要把.h、.lib和.dll文件加入到工程中。
#include <iostream>
#include "sub.h" //链接库的头文件
using namespaces std;
#pragma comment(lib,"sub.lib") //加入链接库
int main()
{
sub(,);
return ;
}
把.h和.lib的文件放在相应的目录下 ,有时候有错误,但是也能运行成功。
感觉靠谱的方法是像一些标准库的方法,添加包含目录和库目录,添加依赖项。
第一种方法: 把这个库拷贝到工程目录下,(最好拷贝到vs编译器可以找到的目录下,这个路径在tools---options---projects and soulutions---show libraray的目录下,至于这些目录如何查看,在以前的博客中有相关的文章,这样可以方便编译器编译时候查找到这个库文件) 之后把库头文件拷贝到当前目录下
在libtest的实现文件中,首先包含这个头文件,然后使用pragma指令指明链接库chang.lib,然后再工程中使用这个函数中的库就可以了 第二种方法: 这个库文件可以在任意路径下,首先在tools---options---projects and soulutions---show libraray目录下添加这个库文件所在的目录
然后再在工程属性---configuration properties---Linker---Addtional library directories下添加这个库文件所在的目录 在工程属性---configuration properties---Linker---Input---Addtional dependencies添加要使用的库的名字,现在这个就是chang.lib
之后把库文件的头文件拷贝到libtest工程的源文件文件夹下
最后在源文件中就可以不使用pragma指令了
//另注:生成 .lib文件的工程中可以没有main()函数。
//另注:工程test1之所以生成的是 .lib文件而不是 .dll文件,是因为test1与test2在同一个解决方案中,没有涉及外部接口。
实验表明:lib库方法二像opencv的配置方式,正确。
注意:这个时候会再解决方案文件夹下的debug或release文件夹下生成test1工程的.lib文件test1.lib,在进行编译的时候会将这个静态库的东西完全链接进入exe可执行文件,这样生成的可执行文件可以拷贝出来到任何其他windows平台的计算机上就可以运行;一个缺点就是如果代码很大的话,生成的.exe可执行文件会很大,静态链接方式就是会再编译的时候把所有需要的东西编译链接进可执行程序;
如果使用生成的.dll,这样生成的exe会相对小一些,但是如果将这个可执行文件拷贝到其他windows平台的计算机上,很可能就会无法运行,就需要把这个生成的dll文件拷贝到运行该程序的计算机上的所需要的制定目录下才可以(一般就是system32目录下);缺点就是比较麻烦;
记得以前做过的一次作业就是这样,写的一个MFC的应用程序,拷贝到别人电脑上死活跑不住,结果发现默认的编译方式是动态链接编译方式,之后设置成静态链接进行重编译,发现生成的可执行文件有了数倍的增长,但是放到别人的windows平台的计算机上就很顺利地运行了。
参考:
导出C函数的:
LIB的:
vs下制作和使用.lib静态库
DLL的:
DLL编写教程 - MDA之路
c++中.dll与.lib文件的生成与使用的详解的更多相关文章
- VS2010 C++环境下DLL和LIB文件的生成与调试
利用VS2010工具,调试DLL文件的方法现总结如下: 在一个解决方案中生成两个工程,假设MYDLL和MYDLG两个工程,前者是DLL工程,后者DLG调用前边的DLL工程.设置如下: 目录如下:图,本 ...
- VS2010 C++环境下DLL和LIB文件的生成与调试 备忘
利用VS2010工具,调试DLL文件的方法现总结如下: 在一个解决方案中生成两个工程,假设MYDLL和MYDLG两个工程,前者是DLL工程,后者DLG调用前边的DLL工程.设置如下: 目录如下:图,本 ...
- Nginx中的root&alias文件路径及索引目录配置详解
这篇文章主要介绍了Nginx中的root&alias文件路径及索引目录配置,顺带讲解了root和alias命令的用法,需要的朋友可以参考下 root&alias文件路径配置ng ...
- MFC中的DLL、LIb文件的创建、使用
动态链接库Dynamic-Linked Lib 的创建与使用 动态链接库(Dynamic Link Library 或者 Dynamic-link Library,缩写为 DLL),是微软公司在微软 ...
- VC6.0 设置动态链接库工程生成dll以及lib文件的位置
在"Projet"->"Settings..."的"Link"选项卡中 "Output file name"中设置 ...
- Protobuf 文件生成工具 Prototool 命令详解
Protobuf 文件生成工具 Prototool 命令详解 简介 Prototool 是 Protobuf 文件的生成工具, 目前支持go, php, java, c#, object c 五种语言 ...
- [转载]windows任务管理器中的工作设置内存,内存专用工作集,提交大小详解
windows任务管理器中的工作设置内存,内存专用工作集,提交大小详解 http://shashanzhao.com/archives/832.html 虽然是中文字,但是理解起来还是很困难,什么叫工 ...
- 把java文件打包成.jar (jar命令详解)
把java文件打包成.jar (jar命令详解) 先打开命令提示符(win2000或在运行框里执行cmd命令,win98为DOS提示符),输入jar Chelp,然后回车(如果你盘上已经有了jdk1. ...
- (转)python中调用R语言通过rpy2 进行交互安装配置详解
python中调用R语言通过rpy2 进行交互安装配置详解(R_USER.R_HOME配置) 2018年11月08日 10:00:11 luqin_ 阅读数:753 python中调用R语言通过r ...
随机推荐
- 转:获取GridView中RowCommand的当前索引行
获取GridView中RowCommand的当前索引行 前台添加一模版列,里面添加一个LinkButton 前台 (如果在后台代码中用e.CommandArgument取值的话前台代码就必须在按钮中设 ...
- python列出指定目录下的所有目录和文件
import os import docx def scanfile(rootdir): result = [] for f in os.walk(rootdir): for files in f[2 ...
- [python学习篇][书籍学习][python standrad library][内建类型]之数值
数值类型 — int, float, long, complex 有四种不同的数值类型:普通整数.长整数.浮点数和复数 普通整数(或者简称整数)使用C中的long实现,其精度至少为32位(sys.ma ...
- DS博客作业06—图
1.本周学习总结 1.1思维导图 1.2学习体会 2.PTA实验作业 2.1 图着色问题 图着色问题是一个著名的NP完全问题.给定无向图G=(V,E),问可否用K种颜色为V中的每一个顶点分配一种颜色, ...
- POJ2594Treasure Exploration(最小路径覆盖,相交)
Treasure Exploration Have you ever read any book about treasure exploration? Have you ever see any f ...
- mysql的简单介绍
一 数据类型 分为数值类型,日期时间类型,字符串类型 菜鸟教程网址:http://www.runoob.com/mysql/mysql-data-types.html
- UVa1073 Glenbow Museum
可以把R看成顺时针转90°,O看成逆时针转270° 设R有x个,则180*(n-2)=90*x+270*(n-x) 解得R有(n+4)/2个 O有(n-4)/2个 所以n<4或者n是奇数时无解. ...
- webconfig连接串的使用与用代码写连接串的使用
原文发布时间为:2008-07-25 -- 来源于本人的百度文章 [由搬家工具导入] 1、使用web.config中设置连接串 在web.config中<configuration>... ...
- dedecms--数据库
最近在用dedecms做项目,dedecms里面有数据库操作类,其实这个在实际项目中用起来还是很方便的. 1:引入common.inc.php文件 require_once (dirname(__FI ...
- spring MVC学习之二
什么是Spring MVC Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 Web 应用程序的全功能 MV ...