为什么动态库(.DLL)需要引用导入库(.LIB)?

时间:2016-10-16 09:25:32

标签: c++ visual-studio linker static-linking dynamic-linking

我想,在Visual Studio中,通过设置Project Reference来调用动态库(.DLL文件)中的函数,动态库需要生成导入库(.LIB)文件吗?

据我所知,在Visual Studio中工作,从库中调用函数(例如MyLibrary),有两种配置方式 - 通过添加DLLLIB文件进行传统处理在项目失败中,或通过定义项目参考来改变。

传统上,需要在调用者项目中添加DLLLIB文件:在项目属性中 - >配置属性 - >链接器 - >输入 - >其他依赖项,添加MyLibrary.DLL/LIB;;在项目属性 - >配置属性 - >链接器 - >一般 - >其他库目录,添加MyLibrary.DLL/LIB所属的文件夹。

或者,从Visual Studio 2012开始,可以在调用者项目中添加Project Reference:Project Property - >共同属性 - >参考,添加MyLibrary项目。但是,它需要生成MyLibrary.LIB文件,这里是catch:

A)如果MyLibrary被编译为静态库,它会生成MyLibrary.LIB,没问题;

B)如果MyLibrary编译为动态库,默认情况下会生成MyLibrary.DLL,需要启用动态库来生成导入库.lib个文件): -

1)将以下代码添加到MyLibrary.h文件

#ifdef MyLibrary_EXPORTS
#define MyLibrary_API __declspec(dllexport)
#else
#define MyLibrary_API __declspec(dllimport)
#endif

,其中MyLibrary_EXPORTSMyLibrary_APIMyLibrary项目的唯一定义。

2)然后,对于MyLibrary打算导出的每个函数,只需先于: MyLibrary_API,例如

MyLibrary_API int TheAnswer(){return 42;}

3)此外,在MyLibrary预处理器中,定义MyLibrary_EXPORTS

我的问题是为什么会有这样的差异?

为什么以传统的方式,通过向调用者项目的依赖项添加.DLL.LIB文件,静态库或动态库文件没有区别;但在项目参考方式中,动态库需要生成导入库文件(也是.LIB)?

0 个答案:

没有答案