关于dll函数修饰_declspec(dllexport)的问题

 在学调用dll时候 了解到 dllexport 和 dllimport

在查阅资料后我的理解是只有加了dllexport 修饰的函数 类 数据才能被外部使用

但是在使用qt实际后我发现即使不加一样有导出,不懂是为什么 还是对dllexport 和 dllimport 理解有误

#ifndef HELLOWADD_H
#define HELLOWADD_H

#include "hellowadd_global.h"
extern "C" {

int myAdd (int , int);

}


#endif // HELLOWADD_H

 


#include "hellowadd.h"


int myAdd(int a, int b)
{
    return a + b ;
}

以上是dll内代码

 

一样可以看到函数myAdd有导出 ,而且调用也正常

可能是因为加了 extern "C"

_declspec(dllexport) 和 _declspec(dllimport) 用在从一个dll里导出符号,在另一个dll/exe里包含头文件,动态链接dll使用其导出的符号的时候

  • 如果你头文件和CPP文件都有,直接基于源代码使用当然不属于这种情况。
  • 如果你编译一个lib,另一个dll/exe使用这个lib也不属于这种情况。
  • 如果没有使用_declspec(dllexport),那么你可能使用了一个.def文件定义导出符号。
  • 导出类和类的成员时也有必要使用_declspec(dllexport)。

_declspec(dllimport) 存在可选的情况。

  • 在导出函数时可以省略,但是导出变量时不能省略。
  • 但是导出函数时使用还是比较好,因为编译器明确知道这个信息后可以生成更高效的代码。

 

参考:MSDN importing-into-an-application-using-declspec-dllimport