qt5.9 mingw window编译protobuf

1.准备

我的protobuf版本为3.8.0,cmake为3.13.4版本;

qt版本为5.9,使用自带的mingw,配置好环境变量,将D:\Qt\Qt5.9.7\Tools\mingw530_32\bin(改为自己的安装路径)加入环境变量,记得不要有其他版本的mingw,就使用qt自带的就可以了!

2.Cmake配置

自己新建个文件夹放编译完成的库:

qt5.9 mingw window编译protobuf_第1张图片

点击configure,若你环境变量已经设置可以默mignw编译器,不然你可以特指:

qt5.9 mingw window编译protobuf_第2张图片qt5.9 mingw window编译protobuf_第3张图片

这样就配置完成,出现如下图,有警告的话是因为有些库没有,用不到的,选中右图中的选项:

qt5.9 mingw window编译protobuf_第4张图片qt5.9 mingw window编译protobuf_第5张图片

然后点击生成就可以了。

qt5.9 mingw window编译protobuf_第6张图片

3.cmd mingw32-make

打开cmd,进入刚刚新建的编译目录,输入mingw32-make,一定配置好window环境变量:

等待完成即可。

qt5.9 mingw window编译protobuf_第7张图片

4.qt使用

完成后,复制编译目录圈出的文件到qt工程中,也可以直接使用该目录:

qt5.9 mingw window编译protobuf_第8张图片

然后新建两个文件person.proto和build.bat:

person.proto:

package tutorial;

message Person {
  required int32 id = 1;
  required string name = 2;
  optional string email = 3;
}

build.bat:

protoc --cpp_out=./ person.proto

然后点击build.bat,会生成新的文件

加入qt工程,然后在pro加入

LIBS += $$PWD/tools/lib/libprotobuf.dll.a
LIBS += $$PWD/tools/lib/libprotoc.dll.a

INCLUDEPATH += $$PWD/tools/include
DEPENDPATH += $$PWD/tools/include

 

包括文件是protobuf中src的文件,测试程序:

void protobug() {
	GOOGLE_PROTOBUF_VERIFY_VERSION;
	tutorial::Person person;
	person.set_id(123456);
	person.set_name("Mark");
	person.set_email("[email protected]");
	//write
	QFile file_out(QCoreApplication::applicationDirPath() + "/person.pb");
	if (!file_out.open(QIODevice::WriteOnly)) {
		qDebug() << "can not open file";
	}

	std::ostringstream streamOut;

	person.SerializeToOstream(&streamOut);
	QByteArray byteArray(streamOut.str().c_str());

	QDataStream out(&file_out);
	out << byteArray.length();
	out.writeRawData(byteArray.data(), byteArray.length());
	file_out.close();

	//read
	QFile file_in(QCoreApplication::applicationDirPath() + "/person.pb");
	if (!file_in.open(QIODevice::ReadOnly)) {
		qDebug() << "can not open file";
	}

	QDataStream in(&file_in);
	int dataLength = 0;
	in >> dataLength;

	QByteArray byteArray2;
	byteArray2.resize(dataLength);
	in.readRawData(byteArray2.data(), dataLength);
	tutorial::Person person2;
	if (!person2.ParseFromArray(byteArray2.data(), byteArray2.size())) {
		qDebug() << "Failed to parse person.pb.";
	}

    QString protobuf;
    protobuf =  "这是protobuf库测试\nID: " + QString::number(person.id()) +'\n';
    protobuf += "name: " + QString::fromStdString(person.name())+'\n';
	if (person.has_email()) {
        protobuf += "e-mail: " + QString::fromStdString(person.email());
	}
    QMessageBox::information(NULL, "Protobuftest", protobuf, QMessageBox::Yes , QMessageBox::Yes);
	file_in.close();
}

 

你可能感兴趣的:(实习学习历程)