本文共 3871 字,大约阅读时间需要 12 分钟。
创建项目:
文件 → 新建 → 项目 → 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库就用这里的方法寻找库的具体路径。什么?没看到,那应该你之前的操作步骤出错了,再来一遍吧
创建调用项目:
点击本解决方案 → 右键 → 添加 → 新项目 → 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;}
点击callstaticlib → 右键 → 设为启动项目 → 运行
!!!看,是不是已经可以调用了静态库的函数!!泡杯茶,休息一下,下面开始学习创建动态库以及动态库的调用创建项目:
文件 → 新建 → 项目 → 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"#includeint add(int a, int b) { std::cout << "动态库被调用了" << std::endl; return a + b;}
即生成dll和lib文件
创建项目:
文件 → 新建 → 项目 → 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"#includeusing namespace std;int add(int a, int b) { cout << "dll被调用了"<
创建调用项目:
点击本解决方案 → 右键 → 添加 → 新项目 → 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"#includeusing 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>
点击calldll→ 右键 → 设为启动项目 → 运行
转载地址:http://edzfi.baihongyu.com/