主要参考文章:
[https://blog.csdn.net/weixin_45233585/article/details/106532191](Qt 生成dll和lib方法及简单使用介绍)
[https://blog.csdn.net/Superman___007/article/details/116855359](Qt创建并使用静态链接库(.lib .a))
动态库(DLL)开发中,TECPLOTWIDGET_EXPORT 宏
作用是 标记类的导出与导入。
未添加 TECPLOTWIDGET_EXPORT 的后果
符号未导出:
在编译生成 DLL 时,TecplotWidget 类及其成员函数不会被导出到 DLL 的符号表中。
其他项目(如测试程序)链接该 DLL 时,会因找不到类的实现而 无法创建对象。
运行时崩溃:
即使编译通过,程序在运行时尝试访问未导出的类成员时,会触发 内存访问冲突(例如虚函数表错误),导致异常退出。
添加 TECPLOTWIDGET_EXPORT 的作用
导出类符号:
在编译 DLL 时,TECPLOTWIDGET_EXPORT 会展开为 Q_DECL_EXPORT,强制将 TecplotWidget 类的所有公共成员(包括构造函数、虚函数等)导出到 DLL 中。
导入类符号:
在使用该 DLL 的项目中,TECPLOTWIDGET_EXPORT 会展开为 Q_DECL_IMPORT,告知编译器从 DLL 导入符号。
解决跨模块问题:
确保 TecplotWidget 类的虚函数表(vtable)和成员函数在 DLL 和应用程序之间正确共享,避免内存错误。
技术原理
Windows DLL 机制:
Windows 要求显式声明导出/导入符号,否则符号默认不暴露给外部。
TECPLOTWIDGET_EXPORT 通过宏定义实现了这一点。
Qt 的 Q_DECL_EXPORT/IMPORT:
Qt 提供的宏会根据编译模式(Debug/Release)自动处理符号的导出和导入,确保跨平台兼容性。
statically linked library和shared libray区别
shared library
🔧 构建生成
Windows:生成 .dll(动态链接库)和 .lib(导入库)文件
Linux/macOS:生成 .so / .dylib
🧩 使用方式
你的主程序在链接时只需要 .lib(导入库)
运行时必须找到 .dll,否则程序会崩溃
📦 特点
多个程序可以共享一个 DLL 文件(节省空间)
可以动态替换/更新 DLL 文件而不需要重新编译主程序
运行时加载速度较慢一点,依赖 .dll 存在
对于插件式架构非常适合(例如 Qt 插件、VTK 插件)
Statically Linked Library(静态库,.lib)
🔧 构建生成
Windows:生成 .lib 文件(不再生成 .dll)
Linux/macOS:生成 .a 静态库
🧩 使用方式
主程序在编译时直接把 .lib 中的代码打包进可执行文件
不需要在运行时携带 .dll
📦 特点
程序部署简单,无需额外 .dll
程序体积变大(所有代码静态链接进去)
如果库更新,主程序也必须重新编译
不能在运行时动态加载/替换模块
✅ 示例场景
简化部署的小工具
无法动态加载模块的嵌入式系统
希望单一可执行文件的项目
浙公网安备 33010602011771号