VS生成自己的DLL并调用

目录

一、生成dll

二、调用dll

三、从dll中导出函数的define

四、dll解读


一、生成dll

新建空项目,然后在属性里更改这两个地方

VS生成自己的DLL并调用_第1张图片

代码如下:

fun.h

//fun.h
#pragma once
#include
//定义导出函数,DLLEXAMPLE_EXPORT_API在函数类型前,若是类,则在class和类名之间
#define DLLEXAMPLE_EXPORT_API __declspec(dllexport)

DLLEXAMPLE_EXPORT_API int add(int a, int b);

 fun.cpp

#include"fun.h"

DLLEXAMPLE_EXPORT_API int add(int a, int b)
{
	return a + b;
}

然后选择生成项目,此时会生成一个dll和一个lib,lib说明函数具体位置,dll说明函数具体内容

VS生成自己的DLL并调用_第2张图片

二、调用dll

新建空白项目,直接使用dll的头文件,并添加一个cpp源文件,直接使用头文件里面的函数即可,因为dll项目里面已经定义了可以在外部项目,通过dll调用函数

main.cpp 

#include"fun.h"
#pragma comment(lib, "dll.lib")

int main()
{
	std::cout << "输出a+b=" << add(9, 6) << std::endl;
	return 0;
}

运行此项目时,必须把dll和lib复制到源码所在的路径下 

VS生成自己的DLL并调用_第3张图片

三、从dll中导出函数的define

#define MYDLL2_API __declspec(dllexport)
#else
#define MYDLL2_API __declspec(dllimport)
#endif

可以使用这个更为全面,可以从dll导入导出函数

四、dll解读

  • 若有两个具有依赖关系的动态链接库fun1.dll和fun2.dll,fun2.dll依赖fun1.dll

fun1.dll包含函数

void fun1()
{
    printf("fun1功能\n");
}

void fun11()
{
    printf("fun11功能\n");
}

fun2.dll包含函数

void fun2()
{
    fun1();
    printf("fun2功能\n");
}

void fun22()
{
    fun1();
}

若此时在外部调用上述各功能,则需要根据函数所在位置,调用所需的dll,例如若要调用fun2函数,则只用使用fun2.h、fun2.lib、fun2.dll;但是若要使用fun1函数,则仅调用fun2.dll是没用的,fun2.dll里面没有fun1这个函数,此时只能把fun1.h、fun1.lib、fun1.dll都加上才能用fun1函数。

另外一个曲线救国的方法是在fun2.dll定义一个fun22函数,让它执行fun1函数,这时候运行fun22函数就不需要fun1.dll了,它属于fun2.dll独立的函数了。

  • dll的名称比较敏感,因为编译的时候就固定死了,不能随便修改,比如Debug模式下,编译生成fun.dll,此时不能修改Debug模式下的动态链接库为fund.dll,这样会导致找不到fun.dll
  • lib库的名字不敏感,可以随意修改,调用的时候指明链接的lib即可

你可能感兴趣的:(C++,c++,visual,studio,windows)