当前位置: 首页 > article >正文

Windows编译MongoDB的C++库,并使用Qt调用

最近想用Qt写一款应用,使用MongoDB数据库。

所以尝试使用CMake编译了Mongo-cxx-driver,对于没编译过的同学们来说,还是有点复杂的,所以写下来,为后来者点灯。

环境

Windows11

Visual Studio 2022

CMAKE 3.26.4

MongoDB 1.27

Boost 1.86.0

编译过程概述

mongo-cxx-driver的编译过程,需要使用mongo-c-driver的依赖,所以需要先编译mongo-c-driver,再编译mongo-cxx-driver。

而mongo-cxx-driver又依赖boost, 所以在编译mongo-cxx-driver之前,需要先编译boost。

下载源码包

下载mongo-c-driver

https://github.com/mongodb/mongo-c-driver/releasesicon-default.png?t=O83Ahttps://github.com/mongodb/mongo-c-driver/releases下载mongo-cxx-driver

https://github.com/mongodb/mongo-cxx-driver/releasesicon-default.png?t=O83Ahttps://github.com/mongodb/mongo-cxx-driver/releases下载boost

https://github.com/boostorg/boost/releasesicon-default.png?t=O83Ahttps://github.com/boostorg/boost/releases

编译mongo-c-driver

将mongo-c-driver源码包解压后,进入到目录下的build目录(可以使用源码包目录下的build目录,也可以自定义)。

cmake设置可以用两种方式——手动命令行输入,和cmake-gui图形设置。

1、手动cmake命令:

cmake -G "Visual Studio 17 2022" "-DCMAKE_INSTALL_PREFIX=D:\Project\Cpp\mongo-cxx-driver\mongo-c-driver\" "-DCMAKE_PREFIX_PATH=D:\Project\Cpp\mongo-cxx-driver\" ..\mongo-c-driver-1.27.6

其中,INSTALL_PATH 是设置后面编译输入路径,这个也可以自定义。

2、直接使用cmake-gui,更直观,也方便修改。

点击Configure, 如果设置没有报错,即可点击Generate,生成build文件。

Generate后,即可以在build目录下发现 mongo-c-driver.sln文件,即可以使用Visual Studio编译库文件。

把debug模式改为release模式,并右键“ALL_BUILD”,选择“生成”。

生成成功后,再右键“INSTALL”,选择“生成”。

如此mongo-c-driver就安装完成了,可以看到在Build文件夹下,生成一个bin文件夹存放*.dll文件,lib文件夹存放*.lib文件,include文件夹都是编码需要的头文件。

编译安装Boost

编译安装Boost的过程相对简单,总的来说就是编译Boost源码后,设置Boost环境变量。

1、运行boost源码包中的bootstrap.bat,在源码包中会生成b2.exe

2、运行b2.exe, 会生成stage目录,里面就是编译完成的boost的库文件

编译mongo-cxx-driver

编译过程类似mongo-c-driver的编译过程,但需要使用mongo-c-driver编译后的库文件。

cmake命令:

cmake -G "Visual Studio 17 2022" "-DBOOST_ROOT=D:\xxxx\boost_1_86_0" "-DCMAKE_PREFIX_PATH=D:\Project\Cpp\mongo-cxx-driver\mongo-cxx-driver" "-DCMAKE_INSTALL_PREFIX=D:\Project\Cpp\mongo-cxx-driver\mongo-cxx-driver" -Dbson-1.0_DIR=D:\Project\Cpp\mongo-cxx-driver\mongo-c-driver\bin\bson-1.0 -Dmongoc-1.0_DIR=D:\Project\Cpp\mongo-cxx-driver\mongo-c-driver\bin\mongoc-1.0 -DBUILD_VERSION=1.27.6 ..\mongo-cxx-driver-r3.10.2

其中的 BOOST_ROOT填写你的boost路径, install_path 写自定义输出路径, bson-1.0_DIR和mongoc-1.0_DIR填写前面编译好的mongo-c-driver对应的路径。

这里还有一个需要注意的地方,mongo-cxx-driver-r3.10.2,要求使用C++17 Polyfill或者更高,如果不使用,则需要在命令中添加

-DENABLE_BSONCXX_POLY_USE_IMPLS=ON

也可以在cmake-gui中设置:

接下来和mongo-c-driver一样的步骤, 在Visual Studio中打开项目,编译即可获得mongo-cxx-driver的库文件。

Qt调用

在Qt 的.pro文件中添加INCLUDEPATH,和LIBS, 将生成的库文件包含进项目。

或者将需要的库文件复制到自定义文件夹中,并在Qt .pro文件中包含,

再添加 boost文件路径:

INCLUDEPATH += $$PWD/libs/include
LIBS += -L$$PWD/libs/mongo-cxx/ -lmongocxx -lbsoncxx

#boost路径
INCLUDEPATH += D:\xxxxx\boost-1.86.0

下面是简要的实现代码, 用来测试本地MongoDB数据库是否能够连接。

mongo.h

#ifndef MONGO_H
#define MONGO_H

#include <QObject>
#include <QDebug>
#include <bsoncxx/builder/stream/document.hpp>
#include <bsoncxx/types.hpp>
#include <mongocxx/client.hpp>
#include <mongocxx/instance.hpp>
#include <mongocxx/uri.hpp>
#include <bsoncxx/json.hpp>


// #pragma execution_character_set("utf-8");

class Mongo : public QObject
{
    Q_OBJECT
public:
    explicit Mongo(QObject *parent = nullptr);
    ~Mongo();

    static void connectToMongoDB();
    bool connectToHost(QString m_hostName, QString m_port);

private:
    mongocxx::instance* m_dbInstance = nullptr;
    mongocxx::client* m_client = nullptr;

signals:
};

#endif // MONGO_H

mongo.cpp

#include "mongo.h"


Mongo::Mongo(QObject *parent)
    : QObject{parent}
{
    bool ret = connectToHost("localhost", "27017");
    if(!ret) {
        qDebug() << "mongodb连接失败!";
    }
}

Mongo::~Mongo()
{
    delete m_dbInstance;
    m_dbInstance = NULL;
    delete m_client;
    m_client = NULL;
}


void Mongo::connectToMongoDB(){

}

bool Mongo::connectToHost(QString m_hostName, QString m_port)
{
    if(m_hostName=="" || m_port=="")
        return false;

    mongocxx::uri uri{ QString("mongodb://%1:%2").arg(m_hostName).arg(m_port).toLatin1().data()};
    m_dbInstance = new(std::nothrow) mongocxx::instance();
    m_client = new(std::nothrow) mongocxx::client(uri);
    if (!m_client)
        return false;
    qDebug() << "连接成功!";

    return true;
}

然后运行测试:


http://www.kler.cn/news/303881.html

相关文章:

  • centos8构建nginx1.27.1+BoringSSL+http3+lua+openresty
  • 如何在 Vue 3 中使用 Element Plus
  • 3.3k star开源的Notepad++文本编辑器替代品,跨平台
  • 从底层原理上解释 clickhouse 保证完全的幂等性
  • 皮皮鲁周边商品网络销售系统的设计与实现---附源码74752
  • Android前台服务如何在后台启动activity?
  • Leetcode 每日一题:Word Ladder
  • Autosar模式管理实战系列-COMM模块状态机及重要函数讲解
  • neo4j docker 运行4.35 community 版本失败
  • 氢能源多旋翼无人机技术详解
  • vue3.0 使用echarts与echarts-gl 实现3D饼图
  • Spring Boot中实现跨域请求
  • 网约车APP开发指南:基于同城代驾系统源码的实现路径
  • STM32G474RE之RTC
  • C++——内存管理
  • 【软考】设计模式之责任链模式
  • springboot对数据库进行备份+对一个文件夹内的文件按时间排序,只保留最近的8个文件
  • 基于鸿蒙API10的RTSP播放器(四:沉浸式播放窗口)
  • 五星级可视化页面(23):污水处理、防汛可视化大屏
  • 自闭症摘帽流程解析:从诊断到摘帽的完整指南
  • graphQL 参数使用报错问题
  • Node.js学习记录(二)
  • 鸿蒙(API 12 Beta6版)GPU加速引擎服务【自适应VRS】
  • C语言 条件编译
  • 【2024】前端学习笔记5-表单标签使用
  • leaflet【十】实时增加轨迹点轨迹回放效果实现
  • 2024/9/11学校教的响应式前端能学到什么?
  • 【路径规划】APF算法、Vortex APF算法、Safe APF算法和动态Windows方法的比较
  • AI教你学Python 第3天:函数和模块
  • ai智能语电销机器人有哪些功能?