我想,在Visual Studio中,通过设置Project Reference来调用动态库(.DLL
文件)中的函数,动态库需要生成导入库(.LIB
)文件吗?
据我所知,在Visual Studio中工作,从库中调用函数(例如MyLibrary
),有两种配置方式 - 通过添加DLL
或LIB
文件进行传统处理在项目失败中,或通过定义项目参考来改变。
传统上,需要在调用者项目中添加DLL
或LIB
文件:在项目属性中 - >配置属性 - >链接器 - >输入 - >其他依赖项,添加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_EXPORTS
和MyLibrary_API
是MyLibrary
项目的唯一定义。
2)然后,对于MyLibrary
打算导出的每个函数,只需先于:
MyLibrary_API
,例如
MyLibrary_API int TheAnswer(){return 42;}
3)此外,在MyLibrary
预处理器中,定义MyLibrary_EXPORTS
。
我的问题是为什么会有这样的差异?
为什么以传统的方式,通过向调用者项目的依赖项添加.DLL
或.LIB
文件,静态库或动态库文件没有区别;但在项目参考方式中,动态库需要生成导入库文件(也是.LIB
)?