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