文章目录
- [1 C++ 静态库.lib 生成](#1 C++ 静态库.lib 生成)
-
- [1.1 静态库lib的生成方法和使用方法](#1.1 静态库lib的生成方法和使用方法)
- [1.2 创建静态库项目](#1.2 创建静态库项目)
- [1.3 编写.h 和 .cpp文件](#1.3 编写.h 和 .cpp文件)
- [1.4 设置 及 生成 DLL](#1.4 设置 及 生成 DLL)
- [2 调用 C++ 静态库lib](#2 调用 C++ 静态库lib)
-
- [2.1 新建LIBtest及测试代码](#2.1 新建LIBtest及测试代码)
- [2.2 静态库配置 及代码调用测试](#2.2 静态库配置 及代码调用测试)
- [3 实际项目中的使用技巧、及通用设置](#3 实际项目中的使用技巧、及通用设置)
-
- [3.1 设置lib输出路径](#3.1 设置lib输出路径)
- [3.2 设置头文件引入路径](#3.2 设置头文件引入路径)
- [3.3 改进后 测试](#3.3 改进后 测试)
- [4 完整代码.h文件、.cpp 文件](#4 完整代码.h文件、.cpp 文件)
- [5 完整项目文件下载](#5 完整项目文件下载)
1 C++ 静态库.lib 生成
C++ 静态库.lib 生成
和 C++ 动态库.dll生成
,方法基本一样 ,【08】C++实战篇------C++ 生成动态库.dll 及 C++调用DLL,及实际项目中的使用技巧
不同的就是 配置类型-->动态库( .dll)
改为 配置类型-->静态库(.lib)
为了验证效果,使用三种方法导出函数:
- //导出函数
- //导出类
- //以C方式导出函数
1.1 静态库lib的生成方法和使用方法
- 创建静态库lib
cpp
创建静态库lib:
1.VS创建C++ 空项目MyLIB:
编写.h和.cpp文件
在.h文件中宏定义导出图数
2.生成1ib文件:
右键项目-->属性-->配置类型-->静态库(.lib)
以Debug x64 生成解决方案
- 使用静态库lib
cpp
VS创建C++ 空项目LIBtest
使用静态库lib:
隐式调用:
1.把.lib(MyLIB.lib)、.h(mathTest.h)文件放到工程目录下(LIBtest项目的.cpp同目录下)
2.项目右键-- > 属性-->配置属性-->链接器-->输入->附加依项-- > 添加MyLIB.lib
3.#include mathTest.h
4.代码调用
1.2 创建静态库项目
1.VS创建C++ 空项目MyLIB
1.3 编写.h 和 .cpp文件
添加 mathTest.h
和 mathTest.cpp
文件
mathTest.h
cpp
#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"
{
#endif
MATHTEST_API int Cadd(int a, int b);//加法
MATHTEST_API int Csubtract(int a, int b);//减法
#ifdef __cplusplus
}
#endif
#endif
mathTest.cpp
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;
}
1.4 设置 及 生成 DLL
右键项目-->属性-->配置类型-->静态库( .lib)
右键项目-->生成 (如修改后,可以点重新生成)
成功:
查看 生成的lib文件
2 调用 C++ 静态库lib
c
VS创建C++ 空项目LIBtest
使用静态库lib:
隐式调用:
1.把.lib(MyLIB.lib)、.h(mathTest.h)文件放到工程目录下(LIBtest项目的.cpp同目录下)
2.项目右键-- > 属性-->配置属性-->链接器-->输入->附加依项-- > 添加MyLIB.lib
3.#include mathTest.h
4.代码调用
2.1 新建LIBtest及测试代码
右键"解决方案MyLIB",新建C++ 空项目LIBtest
在项目中添加main.cpp文件,及代码
c
#include<iostream>
#include"mathTest.h"
using namespace std;
/*
VS创建C++ 空项目LIBtest
使用静态库lib:
隐式调用:
1.把.lib(MyLIB.lib)、.h(mathTest.h)文件放到工程目录下(LIBtest项目的.cpp同目录下)
2.项目右键-- > 属性-->配置属性-->链接器-->输入->附加依项-- > 添加MyLIB.lib
3.#include mathTest.h
4.代码调用
*/
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;
}
2.2 静态库配置 及代码调用测试
c
使用静态库lib:
隐式调用:
1.把.lib(MyLIB.lib)、.h(mathTest.h)文件放到工程目录下(LIBtest项目的.cpp同目录下)
2.项目右键-- > 属性-->配置属性-->链接器-->输入->附加依项-- > 添加MyLIB.lib
3.#include mathTest.h
4.代码调用

项目右键-- > 属性-->配置属性-->链接器-->输入->附加依项-- > 添加MyLIB.lib

将LIBtest"设为启动项"
方法参考下图
调用测试成功,
导出函数、导出类成员函数、以C方式导出的函数 ,现在这三种函数都用结果都输出了,说明这三种dll导出函数方式都有,但我们最常用的是 以C方式导出的函 ,这中通用个,避免出错。
3 实际项目中的使用技巧、及通用设置
(lib、.h复制到 测试项目的.cpp目录下,太麻烦),下面使用自动路径
删掉LIBtest目录下上一次的操作文件 1.把.lib(MyLIB.lib)、.h(mathTest.h)文件放到工程目录下(LIBtest项目的.cpp同目录下)
3.1 设置lib输出路径
直接将lib生成文件,的生路径设为 "LIBtest
"项目下的.cpp
路径;
为了是的路径通用,这里使用相对路径 ../LIBtest/
,

并且将 MyLIB 设为启动项,设置后需要重新生成lib。
可见新的dll文件已经 生成在LIBtest项目下面了


3.2 设置头文件引入路径
将LIBtest设为启动项;
设置LIBtest项目的 附加包含目录为 ../MyLIB/
这样LIBtest
项目就可以访问 mathTest.h
文件了。

3.3 改进后 测试
再次测试 OK

注意:既然新的dll生成路径已经更改到 "LIBtest
"项目下的.cpp
路径,那么第一次在 MyLIB\x64\Debug\
路径下生成的生成的lib
最好删掉,
不然两个路径同时存在lib,调用时会产生混淆,当两个路径下的lib代码源文件完全一样时,似乎并没有影响。一旦新的lib代码修改了,这时两个路径下lib内容不一致,调用运行时就会出错。
所以下面路径的3文件删掉。
4 完整代码.h文件、.cpp 文件
为了统一规范,同时使用"以C语言的方式导出函数"
导出函数、导出类成员函数、以C方式导出的函数 ,现在这三种函数都用结果都输出了,说明这三种dll导出函数方式都有,但我们最常用的是 以C方式导出的函 ,这种通用个,避免出错。
mathTest.h文件
c
#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
//以C方式导出函数
//extern "C",告诉编译器这里是C语言代码
//为了使自己建的库可以在 C/C++ 通用调用,使用 __cplusplus ,
//当C++调用代码时,__cplusplus 值为1,声明函数外面就加了一层"extern "C" {}";
//当C 调用代码时,__cplusplus 值为0,就相当于没有"extern "C" {}";
#ifdef __cplusplus
extern "C"
{
#endif
MATHTEST_API int Cadd(int a, int b); //加法
MATHTEST_API int Csubtract(int a, int b);//减法
MATHTEST_API int Cmultiply(int a, int b); //乘法
MATHTEST_API int Cdivide(int a, int b); //除法
#ifdef __cplusplus
}
#endif
#endif
mathTest.cpp文件
c
#include "mathTest.h"
/*创建静态库lib:
1.VS创建C++ 空项目MyLIB:
编写.h和.cpp文件
在.h文件中宏定义导出图数
2.生成1ib文件:
右键项目-->属性-->配置类型-->静态库(.lib)
以Debug x64 生成解决方案
*/
//以C方式导出函数
int Cadd(int a, int b)//加法
{
return a + b;
}
int Csubtract(int a, int b)//减法
{
return a - b;
}
int Cmultiply(int a, int b)//乘法
{
return a * b;
}
int Cdivide(int a, int b)//除法
{
return a / b;
}
5 完整项目文件下载
完整项目工程文件,下载后可直接编译运行
