文章目录
- 1 C++ 动态库.dll生成 及 调用
- 1.1 生成C++ 动态库dll
- 1.1.1 创建项目MyDLL
- 1.1.2 编写.h 和 .cpp文件
- 1.1.3 设置 及 生成 DLL
- 1.2 调用 C++ 动态库dll
- 1.2.1 创建C++ 空项目DLLtest
- 1.2.2 动态库配置 及代码调用测试
- 2 C++ 静态库.lib 生成 及 调用
- 3 C++ 生成静态库.lib及调用 (纯图教程)
- 3.1 C++ 生成lib
- 3.2 C++ 调用 lib
- 4 C++ 动态库.dll生成 及 调用 (纯图教程)
- 4.1 C++生成DLL
- 4.2 C++调用DLL
1 C++ 动态库.dll生成 及 调用
1.1 生成C++ 动态库dll
为了验证效果,使用三种方法导出函数:
- //导出函数
- //导出类
- //以C方式导出函数
创建动态库d11:1.VS创建C++ 空项目MyDLL:编写.h和.cpp文件在.h文件中宏定义导出图数2.生成dll文件:右键项目-->属性-->配置类型-->动态库( .dll)以Debug x64 生成解决方案
1.1.1 创建项目MyDLL
1.VS创建C++ 空项目MyDLL:
(也可以创建动态链接库
,但不影响,都可以使用)
1.1.2 编写.h 和 .cpp文件
添加 mathTest.h
和 mathTest.cpp
文件
mathTest.h
文件
#pragma once
#ifndef MATHTEST_H
#define MATHTEST_H//宏定义导出:
#ifndef MATHTEST_ //如果没有定义 MATHTEST_,就定义MATHTEST_API __declspec(dllexport)
#define MATHTEST_API __declspec(dllexport) //导出
#else
#define MATHTEST_API __declspec(dllimport) //导入
#endif//导出函数
MATHTEST_API int add(int a, int b);//加法
MATHTEST_API int subtract(int a, int b);//减法//导出类
class MATHTEST_API mathTest
{public:int multiply(int a, int b);//乘法int divide(int a, int b);//除法
};//以C方式导出函数
//extern "C",告诉编译器这里是C语言代码//为了使自己建的库可以在 C/C++ 通用调用,使用 __cplusplus ,
//当C++调用代码时,__cplusplus 值为1,声明函数外面就加了一层“extern "C" {}”;
//当C 调用代码时,__cplusplus 值为0,就相当于没有“extern "C" {}”;#ifdef __cplusplus
extern "C"
{
#endifMATHTEST_API int Cadd(int a, int b);//加法MATHTEST_API int Csubtract(int a, int b);//减法
#ifdef __cplusplus
}
#endif#endif
mathTest.cpp
文件
#include "mathTest.h"/*创建动态库d11:1.VS创建C++ 空项目MyDLL:编写.h和.cpp文件在.h文件中宏定义导出图数2.生成dll文件:右键项目-->属性-->配置类型-->动态库( .dll)以Debug x64 生成解决方案
*///导出函数
int add(int a, int b)//加法
{return a + b;
}
int subtract(int a, int b)//减法
{return a - b;
}//导出类
int mathTest::multiply(int a, int b)//乘法
{return a * b;
}int mathTest::divide(int a, int b)//除法
{return a / b;
}//以C方式导出函数
int Cadd(int a, int b)//加法
{return a + b;
}int Csubtract(int a, int b)//减法
{return a - b;
}
1.1.3 设置 及 生成 DLL
右键项目–>属性–>配置类型–>动态库( .dll)
右键项目–>生成 (如修改后,可以点重新生成)
查看 生成的DLL文件
查看DLL
注意是.D:\Projects\C#\MyDLL\x64\Debug
,在工程同级目录下\x64\Debug
下面
而不是 D:\Projects\C#\MyDLL\MyDLL\x64\Debug
,而不是在.h同级目录的\x64\Debug
下面(刚开始就在这里找,发现MyDLL.dll.recipe
多了一个.recipe,迷糊了半天)
1.2 调用 C++ 动态库dll
方法:
创建C++ 空项目DLLtest使用动态库d11:隐式调用:1.把.lib(MyDLL.lib)、.dll(MyDLL.d11)、.h(mathTest.h)文件放到工程目录下(DLLtest项目的.cpp同目录下)2.项目右键-- > 属性-->配置属性-->链接器-->输入->附加依项-- > 添加MyDLL.lib3.#include mathTest.h4.代码调用
1.2.1 创建C++ 空项目DLLtest
创建C++ 空项目DLLtest
(也可以创建在MyDLL解决方案同一目录下)
1.2.2 动态库配置 及代码调用测试
使用动态库d11:
隐式调用:
使用动态库d11:隐式调用:1.把.lib(MyDLL.lib)、.dll(MyDLL.dll)、.h(mathTest.h)文件放到工程目录下(DLLtest项目的.cpp同目录下)2.项目右键-- > 属性-->配置属性-->链接器-->输入->附加依项-- > 添加MyDLL.lib3.#include mathTest.h4.代码调用
完整代码
#include<iostream>
#include"mathTest.h"
using namespace std;/*
VS创建C++ 空项目DLLtest使用动态库d11:隐式调用:1.把.lib(MyDLL.lib)、.d11(MyDLL.d11)、.h(mathTest.h)文件放到工程目录下(DLLtest项目的.cpp同目录下)2.项目右键-- > 属性-->配置属性-->链接器-->输入->附加依项-- > 添加MyDLL.1b3.#include mathTest.h4.代码调用
*/int main()
{//调用dll导出的函数int sum = add(10, 5);int sub = subtract(10, 5);//调用dll导出的类成员函数mathTest mathT; //实例化对象int mul = mathT.multiply(10, 5);int div = mathT.divide(10, 5);//调用以C方式导出的函数int Csum = Cadd(10, 5);int Csub = Csubtract(10, 5);cout << "我的动态库dll调用: "<< endl;cout << "add(10,5) = " << sum << endl<< "subtract(10,5) = " << sub << endl<< "multiply(10,5) = " << mul << endl<< "divide(10,5) = " << div << endl<< "Cadd(10,5) = " << Csum << endl<< "Csubtract(10,5) = " << Csub << endl;return 0;
}
运行测试
2 C++ 静态库.lib 生成 及 调用
C++ 静态库.lib 生成
和 C++ 动态库.dll生成
,方法基本一样,
不同的就是 配置类型-->动态库( .dll)
改为 配置类型-->静态库(.lib)
- 创建静态库lib
创建静态库lib:1.VS创建C++ 空项目MyLIB:编写.h和.cpp文件在.h文件中宏定义导出图数2.生成1ib文件:右键项目-->属性-->配置类型-->静态库(.lib)以Debug x64 生成解决方案
- 使用静态库lib
VS创建C++ 空项目LIBtest使用静态库lib:隐式调用:1.把.lib(MyLIB.lib)、.h(mathTest.h)文件放到工程目录下(LIBtest项目的.cpp同目录下)2.项目右键-- > 属性-->配置属性-->链接器-->输入->附加依项-- > 添加MyLIB.lib3.#include mathTest.h4.代码调用
下面是关键截图
mathTest.h
#pragma once
#ifndef MATHTEST_H
#define MATHTEST_H//宏定义导出:
#ifndef MATHTEST_ //如果没有定义 MATHTEST_,就定义MATHTEST_API __declspec(dllexport)
#define MATHTEST_API __declspec(dllexport) //导出
#else
#define MATHTEST_API __declspec(dllimport) //导入
#endif//导出函数
MATHTEST_API int add(int a, int b);//加法
MATHTEST_API int subtract(int a, int b);//减法//导出类
class MATHTEST_API mathTest
{public:int multiply(int a, int b);//乘法int divide(int a, int b);//除法
};//以C方式导出函数
//extern "C",告诉编译器这里是C语言代码//为了使自己建的库可以在 C/C++ 通用调用,使用 __cplusplus ,
//当C++调用代码时,__cplusplus 值为1,声明函数外面就加了一层“extern "C" {}”;
//当C 调用代码时,__cplusplus 值为0,就相当于没有“extern "C" {}”;#ifdef __cplusplus
extern "C"
{
#endifMATHTEST_API int Cadd(int a, int b);//加法MATHTEST_API int Csubtract(int a, int b);//减法
#ifdef __cplusplus
}
#endif#endif
mathTest.cpp
#include "mathTest.h"/*创建静态库lib:1.VS创建C++ 空项目MyLIB:编写.h和.cpp文件在.h文件中宏定义导出图数2.生成1ib文件:右键项目-->属性-->配置类型-->静态库(.lib)以Debug x64 生成解决方案
*///导出函数
int add(int a, int b)//加法
{return a + b;
}
int subtract(int a, int b)//减法
{return a - b;
}//导出类
int mathTest::multiply(int a, int b)//乘法
{return a * b;
}int mathTest::divide(int a, int b)//除法
{return a / b;
}//以C方式导出函数
//extern "C",告诉编译器这里是C语言代码
int Cadd(int a, int b)//加法
{return a + b;
}int Csubtract(int a, int b)//减法
{return a - b;
}
使用静态库lib:
#include<iostream>
#include"mathTest.h"
using namespace std;/*
VS创建C++ 空项目LIBtest使用静态库lib:隐式调用:1.把.lib(MyLIB.lib)、.h(mathTest.h)文件放到工程目录下(LIBtest项目的.cpp同目录下)2.项目右键-- > 属性-->配置属性-->链接器-->输入->附加依项-- > 添加MyLIB.lib3.#include mathTest.h4.代码调用
*/int main()
{//调用dll导出的函数int sum = add(10, 5);int sub = subtract(10, 5);//调用dll导出的类成员函数mathTest mathT; //实例化对象int mul = mathT.multiply(10, 5);int div = mathT.divide(10, 5);//调用以C方式导出的函数int Csum = Cadd(10, 5);int Csub = Csubtract(10, 5);cout << "我的静态库.lib调用: " << endl;cout << "add(10,5) = " << sum << endl<< "subtract(10,5) = " << sub << endl<< "multiply(10,5) = " << mul << endl<< "divide(10,5) = " << div << endl<< "Cadd(10,5) = " << Csum << endl<< "Csubtract(10,5) = " << Csub << endl;return 0;
}
3 C++ 生成静态库.lib及调用 (纯图教程)
3.1 C++ 生成lib
3.2 C++ 调用 lib
4 C++ 动态库.dll生成 及 调用 (纯图教程)
4.1 C++生成DLL
4.2 C++调用DLL