Windows10编译MongoDB的c++版,并以Qt调用

环境

Windows10
Visual Studio 2019
CMAKE 3.26.0
MongoDB 1.23.2
- mongo-c-driver
- mongo-cxx-driver
boost 1.81.0
Qt 5.15.2

安装Visual Studio 2019

具体教程可见【此处】,不再多复述。

安装CMAKE

从【官网】下载CMAKE,解压后,将bin文件夹的路径,加入到windows的环境变量之中,随后一路点击“确定”即可。
在这里插入图片描述
在这里插入图片描述

安装 mongo-c-driver

在安装mongo的c++库之前,需要先安装c-driver,可参考【官网】。
先在 https://github.com/mongodb/mongo-c-driver/releases 下载mongo-c-driver。
在这里插入图片描述
下载好后解压至mongo-c-driver-1.23.2文件夹中,并新建Build文件夹。
整个文件夹的上下级关系如:
在这里插入图片描述
进入Build目录,打开cmd窗口。
小技巧:可以直接在顶部输入cmd,直接打开当前目录下的cmd窗口。
在这里插入图片描述
再打开的cmd窗口中输入如下命令:

cmake -G "Visual Studio 16 2019" "-DCMAKE_INSTALL_PREFIX=E:\work\WorkFile\MongoDB\mongo-c-driver-1.23.2\Build" "-DCMAKE_PREFIX_PATH=E:\work\WorkFile\MongoDB\mongo-c-driver-1.23.2\Build" ..\mongo-c-driver-1.23.2

如果没有报错的话,Build文件中会生成一个文件mongo-c-driver.sln
然后打开Visual Studio 2019,打开刚生成的项目mongo-c-driver.sln,把debug模式改为release模式,并右键“ALL_BUILD”,选择“生成”。
在这里插入图片描述
这里要等几分钟,生成成功后,再右键“INSTALL”,选择“生成”。
在这里插入图片描述

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

安装Boost

因为mongo-cxx-driver的编译还需要Boost,所以我们需要先安装这一部分。
在【官网】下载最新版的boost。
在这里插入图片描述
在这里插入图片描述
把下载的zip解压,解压后双击文件【bootstrap.bat】,随后会看到在目录中生成一个【b2.exe】,再双击exe程序,boost会自动进行编译,此过程需要半小时左右的耗时,可以先摸个鱼。

编译完成后,把boost的路径添加进入环境变量。
在这里插入图片描述

安装mongo-cxx-driver

在【https://github.com/mongodb/mongo-cxx-driver】下载zip代码文件,并解压在mongo-cxx-driver目录下,同时在mongo-cxx-driver目录下新建一个Build文件夹。
在这里插入图片描述
进入Build文件夹,打开cmd窗口,输入:

cmake -G "Visual Studio 16 2019" "-DBOOST_ROOT=D:\Users\boost_1_81_0" "-DCMAKE_PREFIX_PATH=E:\work\WorkFile\MongoDB\mongo-c-driver-1.23.2\Build" "-DCMAKE_INSTALL_PREFIX=E:\work\WorkFile\MongoDB\mongo-cxx-driver\Build" -DBUILD_VERSION=1.23.2 ..\mongo-cxx-driver-master 

注意,这里要加入“-DBUILD_VERSION=1.23.2”,我之前没加这句话一直报错。
成功后,会在Build文件夹下生成【MONGO_CXX_DRIVER.sln】文件,接着在cmd中输入:

cmake ..\mongo-cxx-driver-master -DCMAKE_BUILD_TYPE=Release -DLIBMONGOC_DIR=E:\work\WorkFile\MongoDB\mongo-c-driver-1.23.2\Build -DLIBBSON_DIR=E:\work\WorkFile\MongoDB\mongo-c-driver-1.23.2\Build -DCMAKE_INSTALL_PREFIX=E:\work\WorkFile\MongoDB\mongo-cxx-driver\Build

每个人的路径都不同,注意修改。
完成后用Visual Studio 2019,打开刚生成的项目MONGO_CXX_DRIVER.sln,把debug模式改为release模式,并右键“ALL_BUILD”,选择“生成”。
在这里插入图片描述
等待生成完成后,再选择“INSTALL”,右键点击“生成”。
在这里插入图片描述

测试mongo数据库

至此,我们mongo的c++库就安装完成了,我们下载一个mongo的二进制文件来测试一下。
到【官网】下载程序。
在这里插入图片描述
在这里插入图片描述
按需配置好后,解压下载的zip文件,此时我们在bin文件夹下双击mongo.exe是不能运行的,我们还需要做一个配置。
1、在bin同等级下新建文件夹data,在data文件夹下再新建文件夹db。
2、在bin同等级下新建文件夹log,在log文件夹下新建文件mongodb.log。
3、进入到bin目录,打开cmd窗口,输入:

mongod --dbpath=..\data\db

4、此时窗口上会输出很多信息,我们在信息中找到ip和port端口号,一般默认都会是127.0.0.1和27017
在这里插入图片描述5、关闭cmd窗口后,在bin同等级下新建文件夹conf,新建文件mongodb.conf,文件中输入代码:

systemLog:
  destination: file
  # 指定日志存放文件
  path: E:\work\WorkFile\MongoDB\mongodb_exe\log\mongodb.log
  logAppend: true
storage:
  journal:
    enabled: true
  # 指定存放数据文件的全路径
  dbPath: E:\work\WorkFile\MongoDB\mongodb_exe\data
net:
  bindIp: 127.0.0.1
  port: 27017
setParameter:
  enableLocalhostAuthBypass: false

6、随后,在bin目录下打开一个cmd,输入:

mongod --config ..\conf\mongodb.conf

此窗口在数据库使用期间不要关闭,否则会导致数据库连接失败。
7、再在bin目录下打开一个新的cmd窗口,输入:
mongo
如此便成功打开数据库了,可以输入测试命令:

数据库基础的操作shell命令,可以看这里:mongodb shell命令大全

1、查看已存在的数据库列表:
show databases
或者是:
show dbs

2、进入数据库,如果数据库不存在则创建:
use DemoDB

3、查看当前所在的数据库名:
db

4、查看数据库中所有集合名:
show collections

5、创建新集合:
db.createCollection("my_collection")

4、在集合中插入数据
db.my_collection.insertOne({uid:1,name:"cdm"})

5、查看集合中的数据
db.my_collection.find()

6、删除当前数据库
db.dropDatabase()

Qt使用Mongo

我们新建一个qt工程,在pro文件中,使程序支持c++17的语法,加入语句:

CONFIG += c++17

随后在pro文件中,添加mongo-cxx-driver和boost的库和头文件的路径:

# MongoDB库
LIBS += -LE:/work/WorkFile/MongoDB/mongo-cxx-driver/Build/lib -lmongocxx -lbsoncxx
INCLUDEPATH += E:/work/WorkFile/MongoDB/mongo-cxx-driver/Build/include
INCLUDEPATH += E:/work/WorkFile/MongoDB/mongo-cxx-driver/Build/include/mongocxx/v_noabi
INCLUDEPATH += E:/work/WorkFile/MongoDB/mongo-cxx-driver/Build/include/bsoncxx/v_noabi

#boost路径
INCLUDEPATH += D:/Users/boost_1_81_0

新建一个测试cpp文件,TestMain.cpp和TestMain.h
想要学习更多mongoDB的c++接口,可以看这里:Qt使用MongoDB的c++接口:连接、创建、写入、读取

TestMain.h

#ifndef TESTMAIN_H
#define TESTMAIN_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 TestMain : public QObject
{
    Q_OBJECT
public:
    explicit TestMain(QObject *parent = nullptr);
    ~TestMain();
    bool connectToHost(QString m_hostName, QString m_port);

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

signals:

};

#endif // TESTMAIN_H

TestMain.cpp

#include "TestMain.h"


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

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

bool TestMain::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;
}

此时编译我报错了。
在这里插入图片描述
搞了很久都没有搞好,最后在bsoncxx/types.hpp文件中的68行,加了#ifndef Q_MOC_RUN处理:

enum class binary_sub_type : std::uint8_t {
#define BSONCXX_ENUM(name, val) k_##name = val,
#include <bsoncxx/enums/binary_sub_type.hpp>
#undef BSONCXX_ENUM
};

改成:

#ifndef Q_MOC_RUN
enum class binary_sub_type : std::uint8_t {
#define BSONCXX_ENUM(name, val) k_##name = val,
#include <bsoncxx/enums/binary_sub_type.hpp>
#undef BSONCXX_ENUM
};
#endif

编译通过,运行成功!
另外,在运行时需要将MongoDB依赖的一些dll库,与exe程序放在同一个目录下,否则会运行失败。
例如:
在这里插入图片描述
如此,整个流程就算是走通了,撒花❀✿✿ヽ(°▽°)ノ✿❀

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值