2021.2.19C++学习笔记————Windows下dll动态库编译及调用

C++学习笔记————Windows下dll动态库编译及调用

一. 编译:
首先,选择Win32项目,设置项目名及地址:
2021.2.19C++学习笔记————Windows下dll动态库编译及调用_第1张图片
选择DLL,空项目:
2021.2.19C++学习笔记————Windows下dll动态库编译及调用_第2张图片
编写动态库:
头文件:

#pragma once;
#include
#ifdef DLL_IMPLEMENT
#define DLL_API _declspec(dllexport)
#else
#define DLL_API _declspec(dllimport)
#endif

extern "C" DLL_API struct idata* rtu(int d, int e, int f);
extern "C" DLL_API int ssd(struct idata* lgd);
extern "C" DLL_API int add(int a, int b, int c, struct idata* d);

//extern "C"是解决C与C++的兼容问题

源文件:

#define DLL_IMPLEMENT

#include"simpledll.h"
#include
#include
#include
#include
#include

struct idata
{
     
    int a;
    int b;
    int c;
};

_declspec(dllexport) extern "C" struct idata* rtu(int d, int e, int f)
{
     
    struct idata edg;
    struct idata* rng;
    edg.a = d;
    edg.b = e;
    edg.c = f;
    rng = &edg;
    return rng;
}   //初始化结构体数据

_declspec(dllexport) extern "C" int ssd(struct idata* lgd)
{
     
    struct idata* rtu(int d, int e, int f);
    *lgd = *rtu(1, 2, 3);
    return 0;
}//赋值结构体数据到另一个结构体

_declspec(dllexport) extern "C" int add(int a, int b, int c, struct idata* d)
{
     
    d->a = a;
    d->b = b;
    d->c = c;
    return a+b+c;
}//结构体内数据求和

编译生成DLL及LIB文件。

二. 调用:
创建Win32控制台应用项目:
2021.2.19C++学习笔记————Windows下dll动态库编译及调用_第3张图片
项目文件夹中添加DLL库,LIB文件和头文件,
编写项目源文件:

#include
//#include
//using namespace std;
#pragma comment(lib,"simpledll.lib")
_declspec(dllexport) extern "C" struct idata* rtu(int d, int e, int f);
_declspec(dllexport) extern "C" int add(int a, int b, int c, struct idata* d);
int main() {
     

    //printf("调用动态dll函数的结果:%d", rtu(5, 6, 7));
    struct idata* test = rtu(5, 6, 7); //调用初始化结构体函数
    int sum = add(1, 2, 3, test);       //调用结构体元素求和函数
    printf("调用DLL求和结果:%d", sum);  
    getchar();
    return 0;
}

P.S. 我自己实验时编译和调用声明的时候都没有加 _declspec(dllexport) ,也成功了。

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