一、静态库
1、创建静态库
创建项目:
文件 → 新建 → 项目 → visual c++ → win32程序(项目命名为staticlib) → 下一步→ 静态库(其他默认即可) → 完成
创建头文件:建立一个头文件来对静态库将要导出的函数来进行声明
点击项目staticlib → 右键 → 添加 → 新建项 → visual c++ → 头文件(文件命名为header.h)
在header.h文件中键入:
#pragma once
//因为c++会名称摧毁,所以这里extern 函数时必须制定为C的格式,所以这里加了“C”
extern "C" int add(int a, int b);
创建cpp文件:创建一个c++文件来对静态库将要导出的函数进行定义
点击项目staticlib → 右键 → 添加 → 新建项 → visual c++ → c++文件(文件命名为source.cpp)
在source.cpp文件中键入:
//其中iostream必须在stdafx.h之前引入,否则会出错
#include <iostream>
#include "stdafx.h"
#include "header.h"
int add(int a, int b) {
return a + b;
}
以上全部完毕后生成解决方案,即可看到这个项目所生成的Lib文件,也就是我们即将调用的Lib文件。
Lib文件具体位置查看:点击visual studio中创建的dll工程 → 右键 → 在文件资源管理器中打开文件夹 → 进入文件夹上一级(就是打开的文件夹所在的文件夹) →(如果你的visual studio的64位模式编译,则这里点击“x64文件”,如果你使用x86模式编译则直接进入下一个箭头) → Debug/Release(这个取决于你刚刚使用visual studio进行编译时选择的debug还是release模式) → 现在相信你就可以看到.lib文件了。注意后面要链接lib库或者dll库就用这里的方法寻找库的具体路径。什么?没看到,那应该你之前的操作步骤出错了,再来一遍吧
2、调用静态库
创建调用项目:
点击本解决方案 → 右键 → 添加 → 新项目 → win32项目(命名为callstaticlib)→ 确定 → 控制台应用程序 → 完成
在callstaticlib.cpp中键入
#include "stdafx.h"
#include <iostream>
// 引入头文件(在导入库时必须引入需要导入的函数的声明,这里如果你掌握不好相对路径,可以使用绝对路径代替,文件夹分隔符注意使用\\)
#include "../staticlib/header.h"
// 链接lib文件,你可以使用绝对路径来导出我们之前生成的lib文件,这里作者一开始编译静态库时使用的debug的x86模式,所以文件夹为../Debug/staticlib.lib,你可以根据上面说到的查找lib文件所在位置的方式,使用lib文件的绝对路径
#pragma comment(lib,"../Debug/staticlib.lib")
using std::cout;
using std::endl;
int main()
{
int rec = add(6, 8);
cout << "相加的结果为 " << rec << endl;
system("pause");
return 0;
}
3、运行项目:
点击callstaticlib → 右键 → 设为启动项目 → 运行
!!!看,是不是已经可以调用了静态库的函数!!泡杯茶,休息一下,下面开始学习创建动态库以及动态库的调用
二、动态库
1、创建动态库
方法一、通过.def文件
创建项目:
文件 → 新建 → 项目 → visual c++ → win32程序(项目命名为dlllib) → 下一步→ DLL(其他默认即可) → 完成
创建.def文件 :
点击项目dlllib→ 右键 → 添加 → 新建项 → visual c++ → 代码 → 模板定义文件(文件命名为dlllib.def,任意即可)
在dlllib.def文件中键入:
;
; .def文件中注释行以;开头
; 除了注释行外的代码第一行必须以LIBRARY 开头,后面跟着动态库的名字,这里就是动态库工程的名字
; 下面EXPORTS表示导出的方法,这里我们要导出”add”方法,而1表示我们以后再调用的时候还可以使用"1"来进行调用
LIBRARY "dlllib"
EXPORTS
add @1
创建cpp文件 :
点击项目dlllib→ 右键 → 添加 → 新建项 → visual c++ → c++文件(文件命名为source.cpp,任意即可)
然后在source.cpp中键入
#include "stdafx.h"
#include <iostream>
int add(int a, int b) {
std::cout << "动态库被调用了" << std::endl;
return a + b;
}
即生成dll和lib文件
方法二、通过_declspec(dllexport)导出
创建项目:
文件 → 新建 → 项目 → visual c++ → win32程序(项目命名为dlllib) → 下一步→ DLL(其他默认即可) → 完成
创建头文件:建立一个头文件来对动态库将要导出的函数来进行声明
点击项目dlllib→ 右键 → 添加 → 新建项 → visual c++ → 头文件(文件命名为header.h)
在header.h文件中键入:
extern "C" _declspec(dllexport) int add(int a, int b);
创建cpp文件:创建一个c++文件来对动态库将要导出的函数进行定义
点击项目dlllib→ 右键 → 添加 → 新建项 → visual c++ → c++文件(文件命名为source.cpp,任意即可)
#include "stdafx.h"
#include "header.h"
#include <iostream>
using namespace std;
int add(int a, int b) {
cout << "dll被调用了"<<endl;
return a + b;
}
2、调用动态库
方法一、隐式调用
创建调用项目:
点击本解决方案 → 右键 → 添加 → 新项目 → win32项目(命名为calldll)→ 确定 → 控制台应用程序 → 完成
链接动态库:在stdafx.h中键入
// #pragma comment(lib,"这里写上创建dll库时dll文件夹中生成的lib库")
#pragma comment(lib,"G:\\programming language\\cpp\\practice\\visual studio\\dlllib\\Debug\\dlllib.lib")
//声明
_declspec(dllimport) int add(int a, int b);
在calldll.cpp中键入
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
int rec = add(7, 8);
cout << "相加的结果为 " << rec << endl;
system("pause");
return 0;
}
执行调用项目:
点击calldll→ 右键 → 设为启动项目 → 运行
方法二、显式调用
创建调用项目:
点击本解决方案 → 右键 → 添加 → 新项目 → win32项目(命名为calldll)→ 确定 → 控制台应用程序 → 完成
在calldll.cpp中键入
#include "stdafx.h"
#include <iostream>
//定义一个函数指针(返回值为int,参数值为两个int)
typedef int(*ADD_FUNC)(int a, int b);
using namespace std;
//动态调用
int main()
{
//""里面写上dll文件路径,注意显式调用时使用lib的路径
HMODULE hmod = LoadLibrary(_T("G:\\programming language\\cpp\\practice\\visual studio\\dlllib\\Debug\\dlllib.dll"));
if (hmod) {
ADD_FUNC add_fp = (ADD_FUNC)GetProcAddress(hmod, "add");
if (add_fp) {
int rec = add_fp(10, 5);
cout << "相加的结果为 " << rec << endl;
}
FreeLibrary(hmod);
}
system("pause");
return 0;
}
并且因为我们要使用GetProcAddress
,所以我们要在stdafx.h中引入windows头文件#include <Windows.h>
3、执行调用项目
点击calldll→ 右键 → 设为启动项目 → 运行