C++ 根据静态库封装动态库(封装动态库__declspec(dllexport):)

一、__declspec(dllexport):

        将一个函数声明为导出函数,就是说这个函数要被其他程序调用,即作为DLL的一个对外函数接口。

       通常它和extern    "C"   合用,形式如下:

extern "C"
{
__declspec(dllexport) RETURN_TYPE FUNCTION()
{
}
}
       这是由于在制作DLL导出函数时由于C++存在函数重载,因此__declspec(dllexport)    FUNCTION(int,int)    在DLL会被decorate,例如被decorate成为    function_int_int,而且不同的编译器decorate的方法不同,造成了在用GetProcAddress取得FUNCTION地址时的不便,使用extern    "C"时,上述的decorate不会发生,因为C没有函数重载,如此一来被extern"C"修饰的函数,就不具备重载能力。

二、案例

例如,你有个静态库和头文件,静态库里有个函数int add(int x, int y),.h文件即头文件一般是函数定义,.CPP文件即源文件是函数的实现。新建一个工程,把头文件和静态库文件放在工程文件夹下面。例如,我的项目中我的静态库放在lib文件夹下,头文件放在include文件夹下。然后配置属性,如下图所示,先配置头文件的依赖,再配置静态库的依赖。

至此,项目所需文件配置成功。接下来就是对静态库中的函数进行封装,就是说这个函数要被其他程序调用,即作为DLL的一个对外函数接口。

我的项目的结构:

首先,在头文件中声明一个对外的函数接口:extern "C" _declspec(dllexport) int ADD(int x, int y);

#pragma once
#include "stdafx.h"
#ifndef _23STATIC_H_
#define _23STATIC_H_
extern "C" _declspec(dllexport) int ADD(int x, int y);
#endif // !_12STATIC_H_

然后,在源文件中写该函数的实现:

#include "stdafx.h"
#include "CFunction.h"  //静态库的函数的声明
#include "MyDLL.h"
#include <iostream>
int ADD(int x,int y)
{
    //add函数是静态库中的函数
    //通过这种方式,给静态库函数包一层实现动态库
    return add(x, y);
}

至此,大功告成,实现了静态库封装动态库的过程,项目中第一次遇到这个需求,我就一步一步把我的怎么实现的过程详尽的写出来了,如果能给你解惑,那便是更好。

猜你喜欢

转载自blog.csdn.net/ezreal_pan/article/details/86593145