设为首页 加入收藏

TOP

C和C++中动态链接库的创建和链接(原创,装载请注明原处)(一)
2019-01-15 18:08:49 】 浏览:203
Tags:动态 链接 建和 原创 装载 注明 原处

C和C++中动态链接库的创建和链接

1.创建DLL(动态链接库)-C++方式

1.创建DLL(动态链接库-C++方式)

1.在VS(以VS2017为例)中创建DLL动态链接库。

解决方案名称为:MyDLL
项目名称为:Dll1
2.创建头文件Dll1.h
输入如下代码:

#pragma once
#ifdef MY_DLL_EXP
#else
#define MY_DLL_EXP _declspec(dllimport)////当编译时,头文件不参加编译,所以.cpp文件中先定义,后头文件被包含进来,因此外部使用时,为dllexport,而在内部编译时,则为dllimport
#endif
//创建一个常量
MY_DLL_EXP extern const double PI;
//创建一个测试用的函数
void MY_DLL_EXP Hello();
//创建一个测试用的类
class MY_DLL_EXP Calculate {
public:
    double add(double a, double b);
    double sub(double a, double b);
    double mult(double a, double b);
    double divd(double a, double b);
};

3.创建Dll1.cpp(如存在则不用创建)
输入如下代码:

#include "stdafx.h"
#include "Dll1.h"
//注意以上两个头文件的相对顺序不能改变
#include <iostream>
#define MY_DLL_EXP _declspec(dllexport)
//导出常量
const double PI = 3.14;
//导出函数
void  Hello() {
    std::cout << "Hello World!" << std::endl;
}
//导出类中的函数
double Calculate::add(double a, double b) {
    return a + b;
}
double Calculate::sub(double a, double b) {
    return a - b;
}
double Calculate::mult(double a, double b) {
    return a * b;
}
double Calculate::divd(double a, double b) {
    if (b == 0)
        return 0;
    return a / b;
}

4.生成即可完成C++版动态链接库的创建
注意:动态链接库文件不能直接执行

2.链接DLL(动态链接库-C++方式)

1.隐式链接

1.准备
Dll1.h(Dll1项目目录中)
Dll1.lib(解决方案的Debug中)
Dll1.dll(结局方案的Debug中)
2.创建一个测试用隐式链接动态链接库的项目
此处以空项目为例

项目名称为:testDll1
此处为了方便,将Dll1.h,Dll1.lib,Dll1.dll放入到新建的项目目录下。
3.右击解决方案,选择属性。在通用属性中的启动项目中选择当前选中内容,确认即可。

4.右击要链接DLL的项目testDll1,选择属性,进行配置。
(1)配置属性->VC++目录->在"包含目录"里添加头文件Dll1.h所在的目录



(2)配置属性->VC++目录->在"库目录"里添加头文件Dll1.lib所在的目录


(3)配置属性->链接器->输入->在"附加依赖项"里添加Dll1.lib(若有多个lib则以空格隔开)


4.将Dll1.dll文件放入到创建的项目的目录下或是解决方案的Debug目录下
5.创建testDll1.cpp
输入如下测试代码:

#include "Dll1.h"
#include <iostream>
//隐式调用DLL
using namespace std;

int main() {
    cout << PI << endl;//测试输出常量
    Hello();//测试函数
    //测试类
    Calculate calc;
    cout << "3 + 2 = " << calc.add(3, 2) << endl;
    cout << "4 - 1 = " << calc.sub(4, 1) << endl;
    cout << "3 * 2 = " << calc.mult(3, 2) << endl;
    cout << "4 / 2 = " << calc.divd(4, 2) << endl;
    cin.get();//暂停
}

输出结果:

2.显式链接

显示链接可以在执行过程中随时加载DLL文件,也可以随时卸载DLL文件,这是隐式链接所无法作到的,所以显式链接具有更好的灵活性,对于解释性语言更为合适.
显示链接主要是使用LoadLibrary()函数。此处只说明显示链接DLL的导出函数的使用方法,导出类的使用比较复杂,将在我的其他文章中说明。
1.创建测试用空项目testDll2
2.将Dll1.dll放入到testDll2项目目录下
3.创建testDll2.cpp
输入如下代码:

//显示链接DLL-使用GetProcAddress获取函数的名字会有所改变需要使用dumpbin.exe查询
#include <Windows.h>//加载头文件
#include <iostream>

using namespace std;
//设置全局变量hInst用于存储dll句柄并加载动态链接库
HINSTANCE hInst = nullptr;
//声明函数指针
typedef void(*Hello)();

int main() {
    //加载动态链接库D111.dll
    hInst = LoadLibrary("Dll1.dll");
    if (hInst == nullptr) {
        cout << "动态链接库加载失败!!!" << endl;
        FreeLibrary(hInst);
        cin.get();
        return 0;
    }
    //加载导出函数,此处函数名有所不同,需要使用dumpbin.exe进行查询
    Hello hello = (Hello)GetProcAddress(hInst, "?Hello@@YAXXZ");
    cout << "Hello()=";
    hello();
    cin.get();
    //释放动态链接库
    FreeLibrary(hInst);
    return 0;
}

4.查询函数名称的方法
使用dumpbin.exe查询
打开VS的自带的本机工具命令提示

打开之后的界面:

进入Dll1.dll所在路径


在控制台中输入dumpbin -exports Dll1.dll进行查询


Hello函数的函数名为?Hello@@YAXXZ
5.生成并运行
运行结果

2.创建DLL(动态

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇cf97D. Robot in Basement(模拟 b.. 下一篇你这一辈子要用到的C数学函数都在..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目