• dll和lib关系及使用


    对于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
     

    编译完成之后,可以在指定的目录下面找到.lib和.dll。

    对于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文件来重命名输出的方法名。
  • 相关阅读:
    毕业设计-1.11
    毕业设计-1.10
    毕业设计-1.09
    毕业设计-1.08
    毕业设计-1.07
    [工具]Maven的安装和配置【MyEclipse】
    毕业设计-1.06
    tomcat部署项目时省略项目名
    Jenkins实现iOS项目自动化打包(含踩坑记录)
    钉钉小程序封装网络请求
  • 原文地址:https://www.cnblogs.com/ouyangping/p/7941193.html
Copyright © 2020-2023  润新知