导航

QT新建项目编译lib和dll

Posted on 2025-05-23 00:37  Zyeah  阅读(99)  评论(0)    收藏  举报

主要参考文章:

[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

程序体积变大(所有代码静态链接进去)

如果库更新,主程序也必须重新编译

不能在运行时动态加载/替换模块

✅ 示例场景
简化部署的小工具

无法动态加载模块的嵌入式系统

希望单一可执行文件的项目