上回讲述了CMake使用动态库与使用静态库之间并没有太大的区别,并讲述了学习期间碰到的问题:无法正确生成动态库DLL,导致使用动态库的test测试项目无法正确编译;
【 学习时遇到的疑问 】
既然已经include_directories指定头文件的搜索路径,头文件已经声明,使用动态库为毛还要lib中的声明?
声明在头文件是没错的,所以需要include_directories来指定头文件的搜索路径;但是lib也并不包含函数的声明,只是dll中的函数的列表而已,这一点我理解错了!
在此将动态库与静态库之间的区别做一个对比,分析错误的原因:
部分资料来自:http://www.cppfans.org/1394.html
动态库与静态库的对比
静态库lib
编译静态库:生成的是一个lib文件(static lib);
对于静态库lib的调用者:
编译时:链接使用lib文件(这个过程可以理解为:链接并把函数的实现一起打包进执行文件中)。
运行时:则不需要则不需要lib文件;注:静态库的lib:里面其实就是源文件函数的实现;
动态库dll
动态库编译之后有3个文件:.dll,.lib(dynamic lib),.exp;
其中lib只是dll的附属品,是dll导出的函数列表文件;对于动态库dll的调用者:
编译时:需要lib文件,并将导出函数列表打包进可执行文件中,此过程并不需要dll文件;
运行时:需要dll文件,并根据导出函数列表动态链接dll文件,此过程不需要lib文件,但不能缺少dll文件,否则可执行文件无法执行;
往下继续对动态库d

本文介绍了CMake构建动态库时遇到的问题,动态库与静态库的区别,包括静态库编译生成lib文件,动态库编译生成dll、lib和exp文件。动态库在编译和运行时的不同需求,以及动态库的入口函数DllMain和导出函数的概念。文章通过模块定义文件和_declspec(dllexport)两种方式展示了如何导出动态库函数。
最低0.47元/天 解锁文章
1112

被折叠的 条评论
为什么被折叠?



