Visual Stdio的中的dll和lib
来源:互联网 发布:梦幻西游手游源码 编辑:程序博客网 时间:2024/05/22 08:17
自己的一点点小笔记,留给将来需要的时候看看。
运行环境:windows7和VS2010
对于dll和lib两者的关系,需要理解的一个概念是编译时和运行时。
lib是编译时的东西,在lib里面包含了方法名和方法所在的dll名字,可以用dumpbin -all XXX.lib查看内容。
dll是运行时的东西,里面是方法的实体。可以通过depends查看里面的方法和引用的dll文件等。
举个例子方便理解:
有两个project,A和B,A的输出是一个动态dll,B的输出是一个exe。B需要用到A里面的类和方法等。
首先是对A的处理:要把A的类或方法定义为“导出型”,即使用关键字_declspec(dllexport)。
如把一个类定义为导出类:class _declspec(dllexport) BaseTool{}
并且在A的project里面把配置类型设为dll动态库,编译完毕的时候可以看到A.dll和A.lib两个文件。可以把A.dll和A.lib输出到两个不同的目录下。如下图所示:在“常规”->“输出目录”这边设置输出lib的文件夹,在“链接器”->"常规"->"输出文件"这边设置输出的dll文件,注意一个是文件夹,一个是文件。
图1
图2
对于B,也需要一系列的处理:
首先是头文件,需要把A里面对于类定义的头文件夹放到项目属性中的包含目录下,如下图:
图3
这里面发现了一个比较有意思的事情,原先我以为只要把头文件加到solution栏里面的项目头文件处就可以了(如下图),项目就会自动包含进来。没想到不是这样子的,关键还是在上图的包含目录里面加入头文件所在的文件夹路径,下图解决方案里面的可能只是方便开发人员打开头文件设置的,加不加不影响编译和运行。
图4
其次是附加库目录和附加依赖项:
图5
图6
附加库目录也可以通过图3中的‘库目录’替代,两者效果一样。
附加依赖项是包含所需要的lib文件,可以指定全路径,也可以只是指定名字,当只指定名字的时候,系统会在附加库目录或者库目录里面搜寻。如果不指定附加依赖项,也可以通过在代码里面加入#pragma comment(lib,"XXX.lib")来实现。
到此为止,编译应该是可以过了,但是具体运行的时候,会报出找不到dll的错误,这就是运行时错误了。
用dumpbin -all A.lib并重定向到一个txt文件中,可以看到lib里面有提到方法属于哪个dll,因此需要让它知道在哪里查找dll。
这时是运行时的事情了,需要设置系统环境变量,把dll所在目录加进去就可以了。如果是debug模式,需要重启VS。
其实lib文件可以不需要,而直接调用dll里面的方法。
采用LoadLibrary和GetProcAddress的方法,那样子可以不需要lib文件。但是有一个重大影响,就是得知道方法名的准确名字。特别是对于c++输出整个类的情形。因为c++输出dll的时候,类的方法名都被打乱了,加入了很多的信息,所以一般情况下是不知道的,得通过def文件来重命名输出的方法名。
马马虎虎一笔流水账,算作博客第一份文章。
- Visual Stdio的中的dll和lib
- Visual Stdio的中的dll和lib
- Visual Stdio中的断点
- VC中的lib和dll
- c++中的lib和dll
- lib和dll中的全局变量
- C++中的LIB和DLL
- C++中的dll和lib
- Visual Stdio 无法找到资源编译器DLL
- Visual Stdio 无法找到资源编译器DLL
- Visual C++中的C运行时库浅析(lib dll)
- dll和lib的区别
- lib和dll的区别
- dll和lib的区别
- lib和DLL 的关系
- dll和lib的区别
- lib和dll的关系
- dll和lib的区别
- windows Oracle10g_2013_10_17
- Linux shell编程 9 ---- 判断+运算符
- 网络子系统68_路由表处理设备ip配置事件
- 将数组中的奇数放在偶数前面
- 军哥曰:“写个类,写个对象”,那我就写个贤惠类的对象。。。
- Visual Stdio的中的dll和lib
- jsp中使用URL重写跟踪Session,浏览器不支持Cookie的解决方案
- c++中不能被申明为虚函数的函数
- KMP模板
- Linux流量控制——Linux flow control
- 添加网络打印机方法
- local_listener默认为空还是可以有动态监听功能的
- 数据结构------建立一个词索引表
- VC编译时出现This file is read-only的解决方案