博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
visual studio 创建 C/C++静态库和动态库
阅读量:4006 次
发布时间:2019-05-24

本文共 3871 字,大约阅读时间需要 12 分钟。

一、静态库

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 
#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 
// 引入头文件(在导入库时必须引入需要导入的函数的声明,这里如果你掌握不好相对路径,可以使用绝对路径代替,文件夹分隔符注意使用\\)#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 
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 
using namespace std;int add(int a, int b) {
cout << "dll被调用了"<

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 
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 
//定义一个函数指针(返回值为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→ 右键 → 设为启动项目 → 运行

转载地址:http://edzfi.baihongyu.com/

你可能感兴趣的文章
android中shader的使用
查看>>
java LinkedList与ArrayList迭代器遍历和for遍历对比
查看>>
Android DataBinding使用2-Recycleview
查看>>
drat中构造方法
查看>>
JavaScript的一些基础-数据类型
查看>>
JavaScript基础知识(2)
查看>>
转载一个webview开车指南以及实际项目中的使用
查看>>
关于activity保存页面状态的两个方法
查看>>
android中对于非属性动画的整理
查看>>
一个简单的TabLayout的使用
查看>>
关于let{a}=B出现的解构赋值
查看>>
ReactNative使用Redux例子
查看>>
Promise的基本使用
查看>>
android给文字加边框(修改不能居中的问题)
查看>>
coursesa课程 Python 3 programming course_2_assessment_1
查看>>
coursesa课程 Python 3 programming 统计文件有多少单词
查看>>
coursesa课程 Python 3 programming 输出每一行句子的第三个单词
查看>>
coursesa课程 Python 3 programming Dictionary methods 字典的方法
查看>>
Returning a value from a function
查看>>
coursesa课程 Python 3 programming Functions can call other functions 函数调用另一个函数
查看>>