2024:Qt--编译配置Protobuf(windows10) 配图详解

一、准备

本教程的环境及相关准备:

1、Window10系统

2、Qt Creator 5.0.2 Based on Qt 5.15.2 (MSVC 2019, 64 bit)

3、protobuf-3.15.0(本示例使用版本)

Protbuf源码下载地址
在这里插入图片描述

4、cmake-3.21.3-windows-x86_64(本示例使用,下载的zip直接解压使用)

下载cmake 选择相应版本
在这里插入图片描述

二、Protobuf编译

创建一个文件夹,用于存储编译protobuf产生的文件
例如:
在这里插入图片描述

1、打开CMake软件

启动cmake

2、配置Where is source code,protobuf源码路径下的cmake

配置 Where is source code

3、配置Where to build the binaries,即编译后产生文件的路径。

配置 Where to build the binaries
PS:因为之前我已经编译过了,所以路径下已经存在相关文件,如果没编译过路径下为空。

4、Configure

配置
PS 异常
异常1
–>>查看提示,发现Qt路径配置有问题(之前重装过QT!!)
查看问题
QT路径修正后,重新配置
在这里插入图片描述

5、Generating,产生要编译的文件

Generating

6、在编译后产生文件的output路径下,按住Shift+鼠标右键,弹出右键菜单后,打开Powershell窗口

打开窗口1
打开窗口2

7、mingw32-make

在这里插入图片描述
PS 异常:Qt环境变量未配置导致
mingw32-make异常
–>>根据安装路径,配置一下“环境变量”
环境变量

完成后,关闭Windows PowerShell界面 重新打开 继续mingw32-make
正常开始
PS:这个过程会花点时间,稍微等一会
过程1
过程2

PS:我这边到这里就结束了!exe文件已产生,虽然没有100%,但是不影响后继的使用…
完成

三、生成相应.h和.c文件

1、先创建一个 testProto.proto 文件

示例文件内容:

syntax = "proto3";

package protocol;                   // 命名空间


// cmd= 0x0001
message LinkReq {
    string lock_id              = 1;	// 锁体Id
    string user_id              = 2;	// 用户Id
    uint32 protocol_version     = 3;	// 协议版本号
    uint32 random               = 4;	// 随机数1
}

// cmd= 0x8001
message LinkReq_Ack {
    string lock_id              = 1;	// 锁体Id
    uint32 protocol_version     = 2;	// 协议版本号
    uint32 random               = 3;	// 随机数2
    bytes authData              = 4;	// 认证报文
}

2、方法

方法1 直接cmd指令

通过cmd 直接编译.proto文件生成.h和.c文件

通过cmd指令切换到编译后产生文件的output路径下,输入命令

protoc --cpp_out=./ testProto.proto

编译成功后,目录下多了.h和.c文件
编译完成

方法2 批处理文件

把上述 testProto.proto 文件 复制一个并重新命名为 batTestProto.proto
通过Windows批处理文件bat 间接编译.proto文件生成.h和.c文件
创建一个bat文件,如:protoc.bat
内容:

@echo on
setlocal EnableDelayedExpansion

set project_name=batTestProto

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 --cpp_out=./ %project_name%.proto

pause

双击后,发现已自动生成.cc和.h文件
bat双击结果

四、QT中的使用

1、创建QT工程

2、移入protobuf源码

创建QT工程后,在QT工程.pro文件同级目录下创建文件夹protobuf并将protobuf源码src整个目录复制到QT工程所在目录
源码src

工程

3、protobuf目录中移入相关dll、bat、exe文件

在这里插入图片描述
PS:移入bat与exe文件是为了方便随时在工程中可以编辑、编译proto文件生成新.c与.h文件

4、.pro文件中引入src、dll以及pb.h和pb.c

引入

5、序列化与反序列化,并编译运行

编译及运行

结束语

这样就结束了,希望对你有帮助!

<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]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

聊者说

鼓励就是动力,谢谢打赏!

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

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

打赏作者

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

抵扣说明:

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

余额充值