Qt工程实践_03_Qt 动态链接库生成及显式调用(MSVC编译器生成和新建项目中链接动态链接库会造成动态链接库无法使用问题及解决方法;选择MINGW生成和创建新项目链接dll文件就不会存在问题)

本文探讨了在Qt Creator中使用MSVC和MINGW编译器生成及调用动态链接库的差异。在MSVC下,链接动态库可能导致无法使用的问题,而MINGW则能正常工作。解决方案包括正确导入库文件和选择合适的编译器。此外,文章提供了创建新项目并链接dll文件的详细步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本篇以Qt Creater编译器为例,创建并调用动态库,并发现选择MSVC编译器生成和新建项目中链接动态链接库会造成动态链接库无法使用的问题;选择MINGW生成和创建新项目链接dll文件就不会存在问题。

总结:

1.Qt 动态链接库生成及显式调用;

2.如果没有导入库文件(.lib),而只有头文件(.h)与动态连接库(.dll)时,我们才须要显示调用,若是这三个文件都全的话,便可使用简单方便的隐式调用;

3.选择MSVC编译器造成动态链接库无法使用的问题

1.新建动态链接库

  • 新建项目–>Library-->C++
    在这里插入图片描述
  • 选择共享库,命名库名称为myDLL
<think>我们正在处理用户的问题:如何在Visual Studio中将QT Widgets项目打包为动态库静态库。 根据之前的引用,我们得知用户可能遇到了一些困难,特别是关于静态编译问题。引用[1][2]提到,默认的Qt安装是动态编译的,而且静态编译需要自己编译Qt静态库,过程复杂且耗时。引用[3]提供了编译Qt静态库的配置命令示例。 用户的需求是将QT Widgets项目打包为动态库静态库,所以我们分为两部分来回答:动态库静态库。 注意:由于静态库的创建需要静态编译Qt库,而默认安装的Qt是动态的,因此静态库的创建可能需要先编译静态版本的Qt。 步骤概览: 1. 动态库DLL)的创建:相对简单,因为默认的Qt就是动态链接的。 2. 静态库(LIB)的创建:需要先编译静态版本的Qt库,然后配置项目使用静态库。 详细步骤: ## 一、创建动态库DLL) 1. 在Visual Studio中创建一个Qt Widgets Application项目(如果还没有,请先创建)。 2. 修改项目配置,使其生成动态库: - 打开项目属性(右键项目 -> 属性)。 - 在“常规”选项卡中,将“配置类型”改为“动态库(.dll)”。 - 在“C/C++” -> “预处理器”中,添加预处理器定义`BUILD_DLL`(或其他用于导出符号的宏,具体见下一步)。 3. 在代码中,需要导出类或函数。例如,在头文件使用如下方: ```cpp #ifdef BUILD_DLL #define MY_EXPORT __declspec(dllexport) #else #define MY_EXPORT __declspec(dllimport) #endif class MY_EXPORT MyWidget : public QWidget { Q_OBJECT public: MyWidget(QWidget *parent = nullptr); // ... 其他成员 }; ``` 这样,在编译动态库时,会导出类`MyWidget`;在使用动态库的程序中,会导入这个类。 4. 在项目属性中,确保Qt链接设置正确。通常,在安装Qt VS Tools后,Qt的相关路径会自动配置。 5. 编译项目,将生成一个DLL文件。 注意:生成DLL文件需要Qt动态库(如Qt5Core.dll, Qt5Widgets.dll等)一起分发,或者将Qt动态库放在系统路径下。 ## 二、创建静态库(LIB) 创建静态库的前提是拥有静态编译Qt库。如果还没有,需要先编译Qt的静态版本。 ### 步骤1:编译静态Qt库 1. 下载Qt源代码(与已安装的Qt版本一致)。 2. 打开命令提示符(或Qt提供的命令行工具),进入Qt源代码目录。 3. 配置编译选项,使用类似于引用[3]中的命令,但需要根据实际情况调整路径选项: ```bash configure -platform win32-msvc2013 -mp -debug-and-release -static -prefix "E:\Qt\5.3.1-static-vs2013" -qt-sql-sqlite -qt-zlib -qt-libpng -qt-libjpeg -opengl desktop -qt-freetype -no-qml-debug -no-angle -nomake tests -nomake examples -skip qtwebkit ``` 注意: - `-platform`:指定编译器平台,如`win32-msvc2017`(根据你的Visual Studio版本选择)。 - `-static`:表示静态编译。 - `-prefix`:指定安装路径。 - 其他选项根据需求添加或移除。 4. 运行配置命令后,执行`nmake`(或`jom`)进行编译安装。这个过程可能需要几个小时。 ### 步骤2:在Visual Studio中创建静态库项目 1. 在Visual Studio中,创建一个新的Qt Widgets Application项目(或者将现有项目改为静态库)。 2. 修改项目配置: - 打开项目属性,将“配置类型”改为“静态库(.lib)”。 - 在“C/C++” -> “预处理器”中,添加`QT_STATICPLUGIN`(如果需要使用静态插件)`QT_NO_DEBUG`(如果是发布版本)等定义。 3. 配置Qt版本:在Qt VS Tools的设置中,添加刚刚编译的静态Qt库的路径(例如`E:\Qt\5.3.1-static-vs2013`),并设置为当前项目Qt版本。 4. 在代码中,不需要像动态库那样处理导出(因为静态库是链接到可执行文件中的)。但是,如果静态库中包含了Qt的元对象系统(如Q_OBJECT),则需要运行`moc`工具。通常,Qt VS Tools会自动处理。 5. 编译项目生成LIB文件。 注意:使用静态库时,需要将生成的LIB文件其他静态库一起链接到最终的可执行文件中。同时,由于Qt静态编译会将所有用到的模块都链接进去,所以最终的可执行文件会比较大。 ## 注意事项 - 动态库的依赖:动态库依赖于Qt动态库,发布时需要带上这些DLL。 - 静态库的依赖:静态库将Qt代码都链接到库中,但使用该静态库的程序仍然需要链接Qt的静态库(因为静态库中只包含了项目自身的代码,不包括Qt核心库)。实际上,通常的做法是: 1. 将项目编译为静态库(A.lib)。 2. 然后,在另一个应用程序中,链接A.libQt的静态库(如Qt5Core.lib, Qt5Widgets.lib等)。 - 插件问题:如果使用Qt插件(如图像格插件、数据库插件等),在静态编译时需要将这些插件也静态链接到程序中。这可以通过在代码中调用`Q_IMPORT_PLUGIN``Q_INIT_RESOURCE`来实现。 由于静态编译Qt创建静态库的过程较为复杂,用户可以根据实际需求选择动态库或静态库。 根据引用[2][3]的经验,用户可能已经尝试过静态编译但遇到了困难。如果用户不想花费时间编译静态Qt库,那么动态库可能是更简单的选择。 相关问题: 1. 如何解决Qt动态库的依赖问题,使得程序在没有安装Qt的电脑上运行? 2. 静态编译Qt库时,如何优化编译参数以减少编译时间最终文件大小? 3. 在Windows下,如何将Qt插件(如图像格插件)静态链接到程序中?</think>### 如何在 Visual Studio 中将 QT Widgets 项目打包为动态库静态库 #### **一、打包为动态库 (DLL)** 1. **修改项目配置** - 在 Visual Studio 中右键项目 → **属性** → **常规** → **配置类型** → 选择 **动态库 (.dll)** - 在 **C/C++ → 预处理器** 中添加 `QTDLL` 宏定义(避免 Qt 静态链接) ![](https://docs.microsoft.com/zh-cn/cpp/build/media/vs2019-property-page-general.png?view=msvc-170) 2. **导出符号处理** 在公共类/函数声明前添加导出宏(示例): ```cpp // MyWidget.h #ifdef MYLIB_EXPORT # define MYLIB_API __declspec(dllexport) #else # define MYLIB_API __declspec(dllimport) #endif class MYLIB_API MyWidget : public QWidget { Q_OBJECT public: explicit MyWidget(QWidget* parent = nullptr); }; ``` 3. **生成与依赖处理** - 编译后将生成 `.dll` `.lib`(导入库)文件 - 分发时需附带: - 项目生成的 `.dll` - Qt 核心动态库(如 `Qt5Core.dll`, `Qt5Widgets.dll`) - 平台插件目录 `platforms/qwindows.dll` > **验证动态库**:新建测试项目链接导入库(`.lib`),调用 `MyWidget` 并确保 Qt 动态库在 PATH 中[^2][^4]。 --- #### **二、打包为静态库 (LIB)** ⚠️ **前提:必须使用静态编译Qt 库**(默认安装不支持静态链接[^1][^2]) 1. **编译静态 Qt 库** - 下载 Qt 源码(版本需匹配) - 执行静态编译配置(示例命令[^3]): ```bash configure -static -prefix "C:\Qt\5.15.2-static" -platform win32-msvc -nomake examples -nomake tests -opengl desktop -qt-zlib -qt-libpng nmake install # 耗时数小时 ``` 2. **修改项目配置** - 项目属性 → **常规** → **配置类型** → **静态库 (.lib)** - **C/C++ → 代码生成** → **运行时库**:选择 `/MT`(静态 CRT) - **Qt Project Settings** → 切换 Qt 版本为编译好的静态库路径 3. **处理静态资源** 在代码中初始化资源(避免插件加载问题): ```cpp #include <QApplication> #include <QtPlugin> Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin) // 导入平台插件 int main(int argc, char* argv[]) { QApplication::setLibraryPaths(QStringList()); // 禁用动态插件搜索 QApplication app(argc, argv); // ... } ``` 4. **生成使用** - 编译生成 `.lib` 文件 - 使用链接: - 项目生成的 `.lib` - 所有静态 Qt 库(如 `Qt5Widgets.lib`, `Qt5Core.lib`) - Windows 系统库(`user32.lib`, `gdi32.lib` 等) > **关键问题**:静态编译需确保所有依赖(包括图像格插件、SQL驱动)链接到最终程序[^1][^3]。 --- ### **常见问题解决** - **动态库依赖问题**: 使用 [Dependency Walker](http://www.dependencywalker.com/) 检查缺失 DLL,通过 `windeployqt` 工具自动收集依赖: ```bash windeployqt --release path/to/your.dll ``` - **静态编译错误**: 若出现 `undefined reference to Q_INIT_RESOURCE`,在代码中手动初始化资源: ```cpp void loadResources() { Q_INIT_RESOURCE(my_resources); } ``` - **插件兼容性**: 部分 Qt 模块(如 QtWebEngine)不支持静态链接,需移除相关代码[^2]。 --- ### **对比总结** | **类型** | 优点 | 缺点 | |------------|--------------------------|-------------------------------| | **动态库** | 部署灵活、体积小 | 需分发 Qt DLL 插件 | | **静态库** | 单文件分发、无外部依赖 | 编译复杂、文件体积大 | 根据需求选择: - 快速部署 → 动态库(配合 `windeployqt`) - 独立单文件 → 静态库(需预编译 Qt 源码) ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十月旧城

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值