Visual Studio生成并使用动态库(dll,lib)

pre

在VS中创建一个解决方案,解决方案中包含一个库项目,其余所有的项目依赖这个库项目,并且调用这个库项目中的特定函数
/
LibProject/
UseLibProjectA/
UseLibProjectB/

知识准备

这样的依赖关系可以采用静态依赖库lib和动态依赖库dll实现,博主【技术先生】的一篇博客 1
简明的阐述了两者的区别,这里采用了静态链接库的方式。

操作过程

建立库项目

  • 这里选用 [Visual C++] ->[空项目]
  • 修改项目属性,[属性]->[配置属性]->[常规]->[项目默认值]->[配置类型]->[动态库(.dll)]
  • 创建头文件
    宏定义部分根据预编译宏来区分编译操作源自dll项目还是使用dll的项目
    所有的可能会被外部使用的变量或者方法都需要被[TESTDEPEND_API ]标注出来,博主曾经因为忘记把类默认初始方法标注出来而导致编译失败
#pragma once
//TESTDEPEND_EXPORTS 这个宏名称可以自由定义,
#ifdef TESTDEPEND_EXPORTS  
#define TESTDEPEND_API __declspec(dllexport)   
#else  
#define TESTDEPEND_API __declspec(dllimport)   
#endif  

#include <string>

class A {
public:
    TESTDEPEND_API A();
    TESTDEPEND_API void hello(std::string name);
private :
    int c;
    int b;
};
  • 生成方法实例
#include "A.h"

#include <iostream>

A::A() : b(1),c(2){

}

void A::hello(std::string name) {
    std::cout << b - c << "-hello-" << name << std::endl;
}
  • 添加编译宏。 [属性]->[配置属性]->[C/C++]->[预编译器]->[预编译器定义] 添加TESTDEPEND_EXPORTS

至此为止,库项目创建完毕,我们可以直接编译一遍该项目,根据默认配置,会在指定生成路径下生成与项目名称同名的dll和lib 文件。

我们可以采用VS自带的Dumpbin.exe 程序(在VS安装目录可以检索到)检查一下生成的dll文件中的内容,操作参考fengbingchun的博客 2 ,这个输出的信息还是很难阅读的,但是导出的方法名和相应的参数名还是可以清晰的推断出来,我们可以人工检查一下输出的方法是否和预期一致。

从其他项目中调用库

  • 这里选用 [Visual C++] ->[空项目]
  • 包含头文件, [属性]->[配置属性]->[VC ++目录]->[包含目录] 添加对应文件(.h)的路径,如果可能的话,还是最好添加相对路径,便于迁移
  • 包含库文件路径, [属性]->[配置属性]->[VC ++目录]->[库目录] 添加对应文件(.lib)的路径
  • 添加链接选项, [属性]->[配置属性]->[链接器]->[输入] 添加对应文件(.lib)的名称 e.g TestDepend.lib
    这一步是偷懒的操作,这样添加的链接选项会针对每一个需要链接的文件生效,我们可以不配这一步,取而代之,我们在需要链接库文件的地方写下如下预编译选项

    #pragma comment (lib,"TestDepend.lib")
  • 在项目中需要的地方调用库文件的内容
//上面是对应的库的头文件名称
#include "A.h"
//如果不在链接器的输入中添加lib文件名,则需要按下面一行的方式配置
//#pragma comment (lib,"TestDepend.lib")

int main() {
    A a;

    a.hello("t1");
    a.hello("t2");

    return 0;
}
  • 编译并运行,项目运行成功
  • 在项目发布的时候我们需要将库文件的lib和可执行文件exe放在同级目录,lib文件则不需要了

reference

http://blog.sina.com.cn/s/blog_53004b4901009h3b.html
https://msdn.microsoft.com/zh-cn/library/ms235636.aspx
https://www.cnblogs.com/woshitianma/p/3681403.html
https://blog.csdn.net/zhdnuli/article/details/50427717
https://blog.csdn.net/fengbingchun/article/details/43956673
https://blog.csdn.net/jhgameboy/article/details/23710429

猜你喜欢

转载自blog.csdn.net/u010953266/article/details/80932697