Qt Windows下编译动态库生成的.a文件是什么?
Qt Windows下编译生成的.a文件是什么?
- 引言
- 一、Windows下的.a文件
- 二、其它知识点
引言
众所周知,Linux下的静态库是扩展名为.a的文件,动态库是扩展名为.so的文件。Windows下的静态库是扩展名为.lib的文件,动态库是扩展名为.dll的文件,Windows编译动态库时,也会生成.lib文件,其作为导入库参与编译阶段。而Linux下没有导入库,.so文件参与程序的编译链接阶段及程序的运行阶段。那么,
在Windows下编译动态库生成的.a文件是什么?
一、Windows下的.a文件
-
- 使用Qt,当看到Windows下编译动态库有.a文件生成,瞬间懵了 (
这不是Linux下的静态链接库嘛!
)。
- 使用Qt,当看到Windows下编译动态库有.a文件生成,瞬间懵了 (
-
- 查了qmake,特意Config -= staticlib,也会生成.a文件。后来查看Makefile LIB += 后面的一串字符:有.a文件 也有-l开头没有扩展名的库文件。
-
- 然后手动改Makefile,LIB += 那块从
xx.a
改成-lxx
(对应库的名称),也能编译成功。
- 然后手动改Makefile,LIB += 那块从
那么.a
文件到底是什么?网上一查,都说是Linux下的静态库,emm 说得对,但不全面!因为Windows下也有.a
的静态库,以下是结论:
- 当使用
MinGW
编译器编译动态库,会生成扩展名为.a文件的导入库(类比MSVC的编译器生成的.lib),只参与编译链接过程。 .a文件
并不是必须的,只有dll也能编译链接(仅限MinGW
编译动态库的时候哦)。给我的感觉只是增加编译速度,.a文件很小,动态库dll文件较大
推荐阅读
:IDE/mingw下动态库(.dll和.a文件)的生成和部署使用(对比MSVC下.dll和.lib):https://blog.csdn.net/quguanxin/article/details/131841919
二、其它知识点
-
- Windows或者Linux下 静态库和动态库的文件扩展名,不是取决于系统,而是取决于编译器!
-
- 库文件的优势:
1)提供功能又不暴露源码
2)模块形式的解耦,无需重复编译,也方便管理
- 库文件的优势:
-
- 静态链接库与动态链接库对比:
- 静态链接库优点:无需外部文件,部署简单,性能较好。 缺点:程序体积大,有冗余,更新时需编译整个程序。
- 动态链接库优点:多程序共享库,节省资源,解耦,有更新时替换相应库文件即可。 缺点:部署需确保库文件配置正确,加载库会有轻微性能开销。
深入浅出链接库 | 静态库与动态库:https://cloud.tencent.com/developer/article/2442977
共享库的创建gcc选项“-shared -fPIC -WI”:https://blog.csdn.net/xuxu_123_/article/details/136771103
关于windows平台下CMake生成库中出现的.a文件:https://blog.csdn.net/m0_64240990/article/details/139304240