史上最详细:Qt--编译配置Protobuf(windows10)

本文详细介绍如何搭建Protobuf环境并将其集成到Qt项目中,包括下载安装必备工具、编译Protobuf源码及在Qt中配置使用步骤。

一、Protobuf简介

protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。

Protocol Buffers 是一种灵活,高效,自动化机制的结构数据序列化方法-可类比 XML,但是比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单。

你可以定义数据的结构,然后使用特殊生成的源代码轻松的在各种数据流中使用各种语言进行编写和读取结构数据。你甚至可以更新数据结构,而不破坏由旧数据结构编译的已部署程序。

ProtocolBuffer拥有多项比XML更高级的串行化结构数据的特性,ProtocolBuffer:

  • 更简单

  • 小3-10倍

  • 快20-100倍

  • 更少的歧义

  • 可以方便的生成数据存取类


二、前期准备工作

2.1、下载并安装Qt

QT的下载地址,建议使用5.7以上版本:https://download.qt.io/archive/qt/

选择MinGW 版本选择 next 即可完成安装。


2.2、下载cmake并安装

Cmake下载地址:https://cmake.org/download/

根据向导使用默认选项设置即可完成安装。


2.3、下载protobuf的源码

Protbuf源码下载地址:https://github.com/protocolbuffers/protobuf/releases

选择c++版本源码下载到本地,并解压缩
在这里插入图片描述


2.4、下载并安装MinGW

mingw-get-setup.exe下载地址:http://www.mingw.org/
在这里插入图片描述
注意:需要科学上网,否则会一直卡住,提示错误,连接服务器失败。而且科学上网也会失败(不一定一次就能安装好),不断的继续,一定可以安装好的。

安装教程

按照安装指导到达这一步后,左侧选中Basic Setup,然后对右侧的每一项都鼠标右键选择Mark for installation

在这里插入图片描述
然后选择菜单栏Installation中的Apply Changes,点击Apply开始下载安装

在这里插入图片描述
只需要等待安装完成即可,如下所示:

在这里插入图片描述
检测安装目录下\bin中是否有mingw32-make.exe,有则安装成功

在这里插入图片描述


三、编译Protobuf

3.1、在下载的Protobuf源码目录下新建build文件夹,用来存放编译结果

在这里插入图片描述


3.2、打开CMake,进行配置

在这里插入图片描述

注意项

  • where is the source code:选择protobuf源码下的cmake目录;
  • where to build the binaries:选择在protobuf源码下新建build目录;
  • 如果出现了如下错误,则点击
  • CMake Error: CMake was unable to find a build program corresponding to "MinGW Makefiles". CMAKE_MAKE_PROGRAM is not set. You probably need to select a different build tool.
  • 点击Advanced,将CMAKE_MAKE_PROGRAM项后面的路径设置为MinGW/bin/mingw32-make.exe,重新点击Configure,问题解决!

3.3、选中如下两项,点击Generate进行生成

在这里插入图片描述


3.4、生成完毕如下图所示,在build文件夹中也会生成一些文件

在这里插入图片描述


3.5、在build文件夹下按下shift键,鼠标右键打开命令行,输入mingw32-make开始编译

在这里插入图片描述
在这里插入图片描述
编译结束后,我们打开build文件夹可以看到生成的库文件和protoc.exe,如下图所示:

在这里插入图片描述


四、在Qt中配置protobuf

4.1、编写一个简单.proto后缀文件(注意:后缀必须改为.proto)

在这里插入图片描述


4.2、使用protoc.exe编译.proto文件生成.h.c文件

注意:需要把protoc.exe所在路径加到系统环境变量中

在这里插入图片描述
在这里插入图片描述
在Windows上可以新建批处理文件(.bat),加入如下代码

@echo on
setlocal EnableDelayedExpansion

set project_name=School

set cur_disk=%~d0
set proto_file_dir=%~dp0

%cur_disk%

cd /D %proto_file_dir%

del /F %project_name%.pb.cc
del /F %project_name%.pb.h

"protoc.exe" --proto_path %proto_file_dir% --cpp_out %proto_file_dir% %proto_file_dir%%project_name%.proto

pause

双击即可自动生成.cc.h文件

注意:需保证protobuf添加到系统变量里,或者当前路径下存在protoc.exe


4.3、新建Qt工程,并在.pro文件中添加protobuf源码路径和编译生成的库

INCLUDEPATH += D:\Qt\protobuf-cpp-3.13.0\protobuf-3.13.0\src
LIBS += -L D:\Qt\protobuf-cpp-3.13.0\build -lprotobuf

在这里插入图片描述


4.4、将生成的.h.c文件复制到工程目录下,并添加进工程

在这里插入图片描述
在这里插入图片描述


4.5、编写测试代码

#include "mainwindow.h"

#include <QApplication>
#include <testData.pb.h> //添加头文件
#include <QDebug>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    school::Student stu; //定义对象,每个message都相当于一个struct
    stu.set_chinese(90);
    qDebug()<<"Chinese: "<<stu.chinese();

    MainWindow w;
    w.show();
    return a.exec();
}

在这里插入图片描述

<think> 首先,用户遇到了一个CMake错误:在文件`/home/robot/anaconda3/lib/cmake/protobuf-/protobuf-targets.cmake`的第42行,错误是“部分导出集中的目标已被定义”。用户提到参考了之前的引用,但那些是关于Anaconda路径和nvcc错误的,不是直接相关的。 我需要理解这个错误。从错误信息看,它似乎与Protobuf(Protocol Buffers)的CMake配置文件有关。具体来说,在`protobuf-targets.cmake`文件中,第42行尝试定义一些目标,但这些目标可能已经被其他部分定义了,导致冲突。 用户的环境涉及Anaconda,因为路径是`/home/robot/anaconda3/lib/cmake/protobuf-/`。Anaconda可能安装了自己的Protobuf版本,这可能与系统或其他地方的Protobuf冲突。 可能的解决方案: 1. **检查Protobuf版本冲突**:Anaconda的Protobuf可能与系统安装的Protobuf冲突。用户应该确保只使用一个来源的Protobuf。 2. **更新或重新安装Protobuf**:在Anaconda环境中,更新或重新安装Protobuf包。 3. **修改CMake文件**:如引用中提到的,可能需要对文件进行修改,比如注释掉冲突的部分,但要谨慎。 4. **清理构建**:有时清理构建目录并重新运行CMake可以解决。 5. **设置环境变量**:确保CMake优先使用正确的Protobuf路径。 根据用户提供的引用[1],建议注释掉Anaconda路径的导出,以减少路径冲突。引用[2]讨论了注释掉特定行来解决类似错误。 所以,对于这个错误,我可以建议: - 检查系统中是否有多个Protobuf安装。 - 尝试注释掉Anaconda路径或确保CMake不使用Anaconda的Protobuf- 具体到这个错误,可能需要修改`protobuf-targets.cmake`文件,但应备份并小心操作。 结构化回答: - 解释错误原因。 - 提供逐步解决方案。 - 参考用户给出的引用。 - 使用中文。 - 遵循系统指令:行内数学表达式用$...$,独立公式用$$...$$,但这里可能不需要数学公式。 - 生成相关问题。 - 回答中引用的段落末尾添加引用标识。 回答结构: 1. **理解错误**:简要解释错误原因。 2. **解决方案步骤**: - 步骤1: 检查Protobuf安装。 - 步骤2: 修改环境变量或路径。 - 步骤3: 修改冲突的CMake文件。 - 步骤4: 清理和重建。 3. **注意事项**:提醒备份文件。 4. **相关问题**:生成相关问题。 引用处理:用户提供了引用[1]和[2],我可以参考它们。例如,引用[1]建议注释掉Anaconda路径的导出。 终回答以中文呈现。 </think> ### 解决CMake Error at /home/robot/anaconda3/lib/cmake/protobuf-/protobuf-targets.cmake:42错误 该错误提示**部分导出集中的目标已被定义**(CMake Error: Some (but not all) targets in the export set are already defined),通常是由于Protobuf(Protocol Buffers)库在CMake配置过程中出现冲突所致。根本原因是系统中存在多个Protobuf版本(如Anaconda安装的版本与系统全局版本),导致CMake在解析目标定义时发生重复。以下我将一步步指导您解决此问题,方案基于常见CMake冲突处理原则和您的参考引用[^1][^2]。 #### 错误原因分析 - **冲突来源**:Anaconda环境中的Protobuf(路径`/home/robot/anaconda3/lib/cmake/protobuf-/`)可能与系统级Protobuf(如`/usr/lib/cmake/protobuf`)或其他包管理器(如APT)安装的版本冲突。当CMake尝试加载目标定义时,相同目标名(如`protobuf::libprotobuf`)被多次定义。 - **错误触发点**:文件`protobuf-targets.cmake`的第42行通常包含`add_library()`或`export()`命令,用于导出Protobuf库目标。如果此目标已被其他CMake脚本预定义,就会报错。 - 此问题类似于您参考的Anaconda路径冲突案例[^1]和GPU架构支持错误[^2],需通过隔离环境或修改文件解决。 #### 逐步解决方案 遵循以下步骤操作,每一步执行后重新运行CMake(如`cmake ..`或`catkin_make`),观察错误是否消失。**操作前务必备份相关文件**。 1. **检查并隔离Protobuf版本冲突** - 确认系统中安装的Protobuf版本: ```bash # 检查Anaconda环境中的Protobuf版本 conda list | grep protobuf # 检查系统全局Protobuf版本 dpkg -l | grep protobuf # 适用于Ubuntu/Debian ``` 如果输出显示多个版本(如Anaconda的`protobuf-3.20.x`和系统的`protobuf-3.12.x`),则需优先使用单一来源。 - **解决方案**: - 若项目不依赖Anaconda,注释掉Anaconda的路径导出(参考引用[^1])。编辑`~/.bashrc`文件: ```bash nano ~/.bashrc ``` 找到类似行并注释: ```bash # export PATH="/home/robot/anaconda3/bin:$PATH" # export CMAKE_PREFIX_PATH="/home/robot/anaconda3/lib:$CMAKE_PREFIX_PATH" ``` 保存后执行`source ~/.bashrc`并重启终端。 - 若项目必须使用Anaconda,卸载系统Protobuf(谨慎操作): ```bash sudo apt remove libprotobuf-dev protobuf-compiler # Ubuntu示例 ``` 2. **修改Protobuf CMake文件以解决目标冲突** - 错误指向`protobuf-targets.cmake:42`,该行通常定义库目标(如`add_library(protobuf::libprotobuf ...)`)。如果目标已定义,需注释冲突行(参考引用[^2]的方法)。 - **解决方案**: - 打开文件: ```bash nano /home/robot/anaconda3/lib/cmake/protobuf-/protobuf-targets.cmake ``` - 定位到第42行附近(示例如下,实际内容可能不同): ```cmake # 示例行(可能类似): add_library(protobuf::libprotobuf SHARED IMPORTED) set_target_properties(protobuf::libprotobuf PROPERTIES ...) ``` - **注释掉第42行及相邻的可能冲突行**,例如: ```cmake # add_library(protobuf::libprotobuf SHARED IMPORTED) # 注释此行 # set_target_properties(protobuf::libprotobuf PROPERTIES ...) # 注释相关行 ``` 保存文件并重新运行CMake。 3. **清理构建环境并重建** - 残留的CMake缓存可能加剧冲突: ```bash # 删除构建目录(如build/或devel/) rm -rf build devel # 重新初始化并构建 mkdir build && cd build cmake .. # 或根据项目使用catkin_make make ``` - 如果错误仍存在,尝试强制CMake忽略Anaconda路径: ```bash cmake -DCMAKE_PREFIX_PATH=/usr/lib/cmake .. # 优先系统路径 ``` #### 注意事项 - **备份文件**:修改`protobuf-targets.cmake`前,复制备份: ```bash cp /home/robot/anaconda3/lib/cmake/protobuf-/protobuf-targets.cmake ~/protobuf-targets.cmake.bak ``` - **预防措施**:在虚拟环境中使用Protobuf(如`conda create -n myenv protobuf`),避免全局冲突。 - **验证解决**:成功解决后,CMake应正常生成Makefile,无目标定义错误。 通过以上步骤,该错误通常可解决。如果问题持续,请提供完整的CMake输出日志以进一步诊断[^1][^2]。
评论 13
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

贝勒里恩

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

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

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

打赏作者

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

抵扣说明:

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

余额充值