win10系统下使用mingw编译protobuf,并且在vscode中使用cmake配置应用

该文详细介绍了如何在Windows10系统中使用MinGW编译protobuf库,包括下载源码、配置CMake、设置编译选项、解决编译错误,以及最终在VisualStudioCode(VSCode)中使用cmake工具链创建项目并进行编译。文章还提供了遇到问题时的解决策略,如环境变量设置和报错处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

win10系统下使用mingw编译protobuf,并且在vscode中使用cmake配置应用

1 安装mingw编译器

  • 这里作者使用了QT6自带的mingw编译器进行编译,其他的版本并为测试,感觉应该也可以。

2 安装cmake编辑器

  • 可以自己参考其他博客下载,这个不难

3 下载protobuf源码,地址

  • (作者选择了21.6的版本,写博客的时候已经有22版本了,但是是一个大版本的更新,作者也报错了,就选了21.6版本)

4 开始编译

1 解压protobuf文件夹,在下面新建一个build文件夹

在这里插入图片描述

2 打卡cmake,设置源码路径以及编译路径

在这里插入图片描述

  • 注意,源文件路径是protobuf下的cmake下,而不是直接是protobuf下就可以
3 设置编译选项

在这里插入图片描述
1、 点击configure按钮
2、设置Specify native compilers 自己的编译器
3、 选择mingw makefiles

4 设置自己编译器路径

在这里插入图片描述

  • 分别设置好C,C++的编译器路径
  • 在环境变量中设置mingw的bin路径(这个应该是需要设置的)
    在这里插入图片描述
5 完成设置,再次点击configure按钮

在这里插入图片描述

  • 接着开始编译,然后会报错
    在这里插入图片描述
  • 将报错叉掉,然后复制报错信息cmake -Dprotobuf_BUILD_TESTS=OFF
  • 将其中的protobuf_BUILD_TESTS放到search上取消勾选
    在这里插入图片描述
  • 再次点击configure按钮
    在这里插入图片描述
  • 在点击generate
  • 整个过程完成了
6 使用mingw32-make编译文件
  • 在刚刚新建了的build路径下生成了许多文件
    在这里插入图片描述
    在这个路径下使用mingw32-make对文件进行编译
    在这里插入图片描述
  • mingw32-make -j10 其中j10 是编译线程,根据自己机器设,不影响

在这里插入图片描述

  • 编译完成会有一个protoc.exe文件,则编译成功了(正常情况下,可以使用了)
7 使用mingw32-make install 安装
  • 接着执行mingw32-make install (可能是需要管理员权限)
  • 完成后 就可以看到在C盘下多了这几个文件
    在这里插入图片描述

5 vscode中使用protobuf

1 需要在上一步中进行protobuf的mingw32-make install 安装,不然在cmake中查找不到
2 新建立一个项目,目录为
----demo_protobuf
	---build
	---main.cpp
	---CMakeLists.txt
	---test1.proto

在这里插入图片描述

3 各个文件的内容

CMakeLists.txt

cmake_minimum_required(VERSION 3.0.0)
project(testProtobuf VERSION 0.1.0)

include(CTest)
enable_testing()

find_package(Protobuf REQUIRED)

include_directories(${CMAKE_CURRENT_BINARY_DIR})
protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS test1.proto)

aux_source_directory(. SRC_DIR)


add_executable(${PROJECT_NAME} ${SRC_DIR} ${PROTO_SRCS} ${PROTO_HDRS})
target_include_directories(${PROJECT_NAME} PUBLIC ${Protobuf_INCLUDE_DIR})
target_link_libraries(${PROJECT_NAME} ${Protobuf_LIBRARIES})

set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)

main.cpp

#include "test1.pb.h"
#include <fstream>
#include <cstdio>

void SaveToFile(){
    hello::UsersInfo user_info;
    user_info.set_id(5);
    user_info.set_name("Zhang");
    user_info.set_state("working");
    user_info.set_role("worker");
    std::fstream f_out("saving.bin",std::ios::out|std::ios::binary);
    user_info.SerializeToOstream(&f_out);
    f_out.close();
}

void ReadFromFile(hello::UsersInfo &user_info, std::string filename){
    std::fstream f_in(filename.c_str(),std::ios::in|std::ios::binary);
    if (!user_info.ParseFromIstream(&f_in)) {
        std::cerr << "Failed to parse user_info.pb." << std::endl;
    }
    f_in.close();
}

/*定义一个写protobuf的函数*/

void WriteToProtobuf(hello::UsersInfo &user_info, std::string filename){
    std::fstream f_out(filename.c_str(),std::ios::out|std::ios::binary);
    user_info.SerializeToOstream(&f_out);
    f_out.close();
}

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

    SaveToFile();

    hello::UsersInfo user_info;
    ReadFromFile(user_info, "saving.bin");
    printf("id: %d \t", user_info.id());
    printf("name: %s \t", user_info.name().c_str());
    printf("state: %s \t", user_info.state().c_str());
    printf("role: %s \t", user_info.role().c_str());
    printf("\n");

    user_info.set_id(6);
    user_info.set_name("Li");
    user_info.set_state("learning");
    user_info.set_role("student");
    WriteToProtobuf(user_info, "saving.bin"); 

    ReadFromFile(user_info, "saving.bin");
    printf("id: %d \t", user_info.id());
    printf("name: %s \t", user_info.name().c_str());
    printf("state: %s \t", user_info.state().c_str());
    printf("role: %s \t", user_info.role().c_str());
    return 0;
}


test1.proto

syntax = "proto3";	//默认proto2,这里用proto3

package hello; //C++ 类似 namespace

message UsersInfo{
  int32 id = 1;
  string name = 2;
  string state = 3;
  string role = 4;
}
4 在vscode 中使用cmake、cmake tools等的插件对项目进行编译,如果是不知道如何使用vscode编译项目cmake项目,可以参考别的博客

在这里插入图片描述

5 运行结果

在这里插入图片描述

6 报错处理

  1. 在4.6中执行mingw32-make 编译的时候出现 redefine报错的时候,很有可能是在系统环境变量中,设置了多个mingw的编译器的bin路径,取消 掉就好
  2. 在cmake中find_package(Protobuf REQUIRED)中找不到包,可能是你没有安装,执行4.7的安装,然后重启一下vscode

写于:2023/4/17
原文链接:https://blog.csdn.net/qq_43190806/article/details/130210412
嘻嘻嘻

<think>好的,用户想在Windows系统使用MingW从源码编译libtorch。我需要根据提供的引用信息和系统级指令来生成一个清晰的回答和相关问题。 首先,我需要确认用户的需求:使用MingWWindows上编译libtorch。用户可能已经有一定的开发经验,但可能对具体的编译步骤不熟悉,尤其是涉及交叉编译或依赖管理的问题。 接下来,检查提供的引用内容。引用[2]提到了在Ubuntu下使用MingW交叉编译多个库,包括x264、x265等,这可能对处理依赖库的编译有帮助。引用[3]中提到了使用CMake配置OpenCV的编译,这提示libtorch的编译也可能需要CMake。引用[4]提到了Eclipse的配置,可能和开发环境有关,但用户的问题更关注编译过程,所以可能暂时不需要IDE部分。 系统级指令要求回答使用中文,结构清晰,分步骤解决,并生成相关问题。同时,行内公式用$...$,独立公式用$$...$$,但在这个问题中可能涉及数学公式较少,主要是代码和命令行步骤。需要确保LaTeX语法正确,不过用户的问题可能更多涉及代码块,所以可能不需要太多数学公式。 首先,编译libtorch通常需要CMakeMingW工具链和依赖库。根据引用[3],使用CMake配置源代码和构建目录是必要的步骤。用户需要安装CMake,并正确设置路径。 然后,参考引用[2]中的交叉编译示例,可能需要设置host参数和指定依赖库的路径。例如,在配置使用--host=x86_64-w64-mingw32来指定目标平台,并设置CPPFLAGS和LIBS指向依赖库的头文件和库路径。 不过,libtorch本身可能有不同的依赖项,比如需要提前编译好的依赖库,如OpenBLAS、CUDA(如果使用GPU支持)等。用户需要确保这些依赖项已经正确安装,并且CMake配置时指定正确的位置。 可能的步骤包括: 1. 安装MingWCMake,并添加到系统路径。 2. 下载libtorch源码,可能从PyTorch的GitHub仓库克隆。 3. 使用CMake生成Makefile,指定MingW编译器,设置必要的选项如BUILD_SHARED_LIBS、USE_CUDA等。 4. 处理可能的依赖项,如引用[2]中的zlib、freetype等,但libtorch的具体依赖可能不同,需要查阅官方文档。 5. 运行make命令进行编译,可能会遇到需要调整编译器标志或路径的问题,如引用[2]中的CPPFLAGS和LIBS设置。 6. 处理编译过程中出现的错误,例如缺少依赖库或头文件,可能需要手动下载并编译这些依赖项,再指定其路径。 需要注意的是,MingWWindows上的编译可能遇到路径问题,特别是长路径或空格问题,建议将源码和构建目录放在短路径且无空格的目录下,如D:\libtorch-build。 此外,引用[1]提到从源码编译GLFW,可能需要类似步骤:下载源码,配置CMake,指定安装路径。这可能对libtorch的编译流程有参考意义。 生成相关问题需要考虑用户可能的后续疑问,如环境配置、依赖管理、编译优化、常见错误处理等。</think>### 如何在Windows系统使用MingW从源码编译libtorch? 以下是分步指南,结合MingWCMake工具链实现: --- #### **步骤1:安装必要工具** 1. **安装MingW** 确保MingW已正确安装,并包含`g++`、`make`等工具。建议使用[MingW-w64](https://www.mingw-w64.org/)的64位版本,安装时选择`x86_64-w64-mingw32`架构[^2]。 2. **安装CMake** 下载并安装[CMake](https://cmake.org/),配置系统环境变量以支持命令行调用[^3]。 3. **安装Git** 用于克隆libtorch源码仓库。 --- #### **步骤2:获取libtorch源码** ```bash git clone --recursive https://github.com/pytorch/pytorch.git cd pytorch ``` --- #### **步骤3:配置CMake** 1. **创建构建目录** ```bash mkdir build && cd build ``` 2. **生成构建配置** 使用CMake指定MingW编译器(需替换实际路径): ```bash cmake -G "MinGW Makefiles" \ -DCMAKE_C_COMPILER=x86_64-w64-mingw32-gcc \ -DCMAKE_CXX_COMPILER=x86_64-w64-mingw32-g++ \ -DBUILD_SHARED_LIBS=OFF \ -DCMAKE_BUILD_TYPE=Release \ .. ``` - `-G "MinGW Makefiles"`: 指定生成适用于MingW的Makefile[^3] - `-DBUILD_SHARED_LIBS=OFF`: 编译静态库以减少依赖问题 - 若需CUDA支持,添加`-DUSE_CUDA=ON`(需提前配置CUDA环境) --- #### **步骤4:处理依赖项** libtorch依赖第三方库(如Protobuf、FFTW等),需提前编译配置路径。例如,若依赖`zlib`,需设置: ```bash -DZLIB_LIBRARY=/path/to/zlib/lib \ -DZLIB_INCLUDE_DIR=/path/to/zlib/include ``` 类似操作可参考交叉编译其他库的方法[^2]。 --- #### **步骤5:编译与安装** ```bash mingw32-make -j8 # 使用8线程加速编译 mingw32-make install ``` --- #### **步骤6:验证编译结果** 编译完成后,检查`install`目录下的头文件和静态库(如`libtorch.a`)。可通过简单程序链接测试: ```cpp #include <torch/torch.h> int main() { torch::Tensor tensor = torch::rand({2,3}); std::cout << tensor << std::endl; return 0; } ``` --- #### **常见问题** - **依赖缺失**:参考引用[2],需手动编译依赖项并指定路径。 - **路径错误**:避免路径包含空格或中文字符,建议使用短路径如`D:\libtorch-build`。 - **编译器不兼容**:确保MingW版本与系统架构一致(64位优先)。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小兮风

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

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

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

打赏作者

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

抵扣说明:

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

余额充值