visual studio 2015 编写C++ 静态库和动态库、调用静态库和动态库
目录
- 一、静态库
- 1 创建C++静态库
- 2 完成示例代码的编写
- 3 创建“practice”项目来使用StaticLibDemo.lib静态库
- 4 在“practice”项目的主函数中使用StaticLibDemo.lib静态库
- 二、动态库
- 1 创建动态库的方式和创建静态库类似,也是先创建一个空项目,然后将配置类型改成动态库
- 2 工程目录
- 3 创建“practice”项目来使用DLLDemo.dll动态库(隐式调用)
- 4 创建“NewPractice”项目来使用DLLDemo.dll动态库(显示调用)
一、静态库
1 创建C++静态库
1.1 创建一个空项目
1.2 右键选择项目属性
1.3 如下图所示选择静态库
2 完成示例代码的编写
2.1 工程目录如下
2.2 ArrayTool.h
#ifndef ARRAY_TOOL_H
#define ARRAY_TOOL_Hclass ArrayTool
{public:// 返回 first_num 和 second_num 中的最大值int MaxNum(int first_num,int second_num);
};#endif // !ARRAY_TOOL_H
2.3 ArrayTool.cpp
#include "ArrayTool.h"// 返回 first_num 和 second_num 中的最大值
int ArrayTool::MaxNum(int first_num, int second_num)
{return first_num > second_num ? first_num : second_num;
}
2.4 选择生成
执行结果如下图所示,可以看到已经生成了StaticLibDemo.lib静态库文件:
3 创建“practice”项目来使用StaticLibDemo.lib静态库
3.1 工程目录
3.2 在“practice”项目中引用StaticLibDemo.lib静态库
勾选并点击确定后,如下图所示可以看到已经成功引用了StaticLibDemo.lib静态库:
3.3 在“practice”项目中包含静态库头文件所在的目录,防止代码中包含头文件时出错
4 在“practice”项目的主函数中使用StaticLibDemo.lib静态库
main.cpp
#include <iostream>
using namespace std;#include "ArrayTool.h"int main()
{ArrayTool array_tool;int max_num = array_tool.MaxNum(10, -1);cout << "max:" << max_num << endl;getchar();return 0;
}
二、动态库
1 创建动态库的方式和创建静态库类似,也是先创建一个空项目,然后将配置类型改成动态库
2 工程目录
ArrayTool.h
#ifndef ARRAY_TOOL_H
#define ARRAY_TOOL_H#ifdef MYLIBRARY_EXPORTS
#define MYLIBRARY_API __declspec(dllexport) // 导出符号
#else
#define MYLIBRARY_API __declspec(dllimport) // 导入符号
#endif// 声明一个导出函数
extern "C" MYLIBRARY_API int MaxNum(int first_num, int second_num);#endif // !ARRAY_TOOL_H
ArrayTool.cpp
#define MYLIBRARY_EXPORTS // 为了让导出符号有效,所以才需要定义这个宏
#include "ArrayTool.h"// 返回 first_num 和 second_num 中的最大值
int MaxNum(int first_num, int second_num)
{return first_num > second_num ? first_num : second_num;
}
点击生成,可以看到已经生成了DLLDemo.dll动态库,如下图所示
3 创建“practice”项目来使用DLLDemo.dll动态库(隐式调用)
3.1 工程目录
3.2 在“practice”项目中包含动态库头文件所在的目录,防止代码中包含头文件时出错
3.3 引入DLLDemo.lib符号文件(这个lib文件就在DLLDemo.dll同级目录下,和DLLDemo.dll同时生成的)
3.4 给DLLDemo.lib符号文件添加搜索路径
如下图所示,先找到DLLDemo.lib所在的目录:
然后再给DLLDemo.lib符号文件添加搜索路径:
3.5 在主程序中编写示例代码
#include <iostream>
using namespace std;#include "ArrayTool.h"int main()
{int max_num = MaxNum(20, -1);cout << "max_num:" << max_num << endl;getchar();return 0;
}
4 创建“NewPractice”项目来使用DLLDemo.dll动态库(显示调用)
4.1 工程目录
main.cpp
#include <iostream>
#include <Windows.h>// 第一步,创建一个函数指针类型FUNC_MaxNum,它引用的函数类型需要和DLL中的导出函数一致
typedef int(*FUNC_MaxNum)(int first_num, int second_num);int main()
{HINSTANCE hDLL; // 定义一个实例句柄,引用动态库FUNC_MaxNum MaxNum; // 定义一个函数指针,用来指向导出函数// 第二步,加载动态库文件hDLL = LoadLibrary("DLLDemo.dll");if (hDLL){// 第三步,获取动态库中的函数地址MaxNum = (FUNC_MaxNum)GetProcAddress(hDLL, "MaxNum");if (MaxNum){// 第四步,调用函数int max_num = MaxNum(1, 2);std::cout << "max_num:" << max_num << std::endl;}}// 第五步,释放动态库句柄FreeLibrary(hDLL);getchar();return 0;
}
注意:一定要先编译DLLDemo项目生成动态库文件后才运行主程序,否则找不到DLLDemo.dll。