.NET 调用QT 5.12.2 MingW 64/32 生成的DLL

本文介绍了实现QT生成x86和x64的DLL,再通过.NET封装成AnyCpu的DLL供调用的方法。包括选择带有ming64的Qt版本进行安装,在QT Creator创建C++ Libray构建DLL,在VS中创建C#的DLL项目引用并配置成AnyCpu模式,最后导入使用。

实现需求:QT生成x86和x64的DLL,通过.NET封装成AnyCpu的DLL供调用,需要在AnyCpu中自动调用对应位数的DLL。

老版本QT官方没有提供MinGw64位,自己编译时间太长且还容易出错,所以选择的官方带有ming64的Qt版本。

官网在线安装器下载 http://download.qt.io/official_releases/online_installers/

我是选择的5.12.2,记得勾选MinGw 64位,然后继续安装完毕。

打开QT Creator创建C++ Libray,选择,构建32和64的DLL。

由于我这是C接口给C#调用,头文件中输入

extern "C" __declspec(dllexport) int DLLAdd();

源文件中实现。

然后构建项目,对应编译目录中会生成DLL。

注意:需要将附带的QT环境的DLL包拷贝到编译目录,与需要使用的DLL放置在同一个目录,我这里用到这几个,如果不带入进去的话,.NET调用时会出错,也可以通过Depends工具排查DLL中缺少哪些依赖库,复制过去就行。

VS中创建C#的DLL项目,将QT编译出来的库和其他依赖库放置到项目根目录中,然后通过代码进行引用:

配置成AnyCpu模式,这样就能自动切换对应DLL。

点击生成DLL。

接着将生成DLL和其他依赖库导入到需要使用的项目中

然后引用ClassLibrary2.dll,调用对应接口:

/// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
           InitializeComponent();
           txt.Content = Class1.BitTest();
        }
    }

到此基本实现需求。

WpfApp1.exe运行效果。

x64运行:

32位运行:

### 三级标题:问题分析 在使用 `qmake` 构建 Qt 项目时,出现了以下错误: ``` ERROR running qmake: Cannot read qt_lib_mqtt.pri and qt_lib_mqtt_private.pri: No such file or directory Project ERROR: Unknown module(s) in QT: mqtt ``` 该错误表明 `qmake` 无法找到与 `mqtt` 模块相关的 `.pri` 文件,例如 `qt_lib_mqtt.pri` 和 `qt_lib_mqtt_private.pri`。这种情况通常发生在 Qt 的模块路径配置不正确,或者相关模块未被正确安装或构建的情况下。在 Qt 的模块化构建体系中,`.pri` 文件用于定义模块的依赖关系和构建规则,如果这些文件缺失或路径错误,项目将无法正常构建。 ### 三级标题:解决方案 1. **确认 Qt MQTT 模块是否已正确安装** - Qt 的 `MQTT` 模块不是默认包含在所有 Qt 安装包中的,它属于附加模块(Add-on)。如果未在安装 Qt 时勾选 `Qt MQTT` 模块,或者使用的是开源版本且未手动构建该模块,则会导致相关 `.pri` 文件缺失。 - 如果使用的是自定义构建的 Qt 版本,请确认在构建过程中是否包含了 `qtmqtt` 子模块。 - 可以尝试通过 Qt 官方维护的模块仓库获取 `qtmqtt` 并重新构建安装。 2. **检查 .pri 文件是否存在并正确配置路径** - 查找 `qt_lib_mqtt.pri` 和 `qt_lib_mqtt_private.pri` 文件是否存在。它们通常位于 Qt 安装目录下的 `mkspecs/modules` 文件夹中: ``` C:\Qt\Qt<版本号>\<编译器>\mkspecs\modules\ ``` - 如果这些文件缺失,请从 Qt 的官方 GitHub 仓库中获取 `qtmqtt` 模块的源码并手动构建[^1]。构建完成后,将生成的 `.pri` 文件复制到当前编译器对应的 `mkspecs/modules` 目录中。 3. **避免在 Qt 源码树内构建示例工程** - 如果正在尝试构建 Qt 自带的 `qtmqtt` 示例工程,请确保不要在 Qt 源码目录内直接构建,否则会提示如下错误: ``` Project ERROR: You cannot build examples inside the Qt source tree, except as part of a proper Qt build. ``` - 正确做法是将示例工程复制到 Qt 源码目录之外,再使用 Qt Creator 打开并编译[^3]。 4. **检查项目 `.pro` 文件中的模块声明** - 确保 `.pro` 文件中正确引用了 `mqtt` 模块: ```qmake QT += core mqtt ``` - 如果模块未被正确声明,或者拼写错误(如 `mqttt` 或 `qtmqtt`),也会导致此错误。 5. **重新构建 Qt 模块** - 如果上述方法无效,可以尝试重新构建整个 Qt 模块,尤其是 `qtmqtt` 子模块。进入 Qt 源码目录下的 `qtmqtt` 文件夹,运行以下命令进行构建: ```bash qmake make make install ``` ### 三级标题:示例代码 以下是一个典型的 `.pro` 文件示例,确保模块引用正确: ```qmake QT += core mqtt TARGET = mqttclient TEMPLATE = app SOURCES += main.cpp \ mainwindow.cpp HEADERS += mainwindow.h ``` ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值