visual studio 创建 C/C++静态库和动态库

本文详细介绍了在Visual Studio中创建和调用C++静态库及动态库的方法。包括如何创建静态库项目、添加头文件和源文件,以及如何在其他项目中调用静态库。同时,还介绍了两种创建动态库的方法,一种是通过.def文件,另一种是通过_declspec(dllexport),并解释了如何隐式和显式地调用动态库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、静态库

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→ 右键 → 设为启动项目 → 运行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值