如何使用MinGW在Windows中构建Google的protobuf?
How to build Google's protobuf in Windows using MinGW?
我使用Codeblocks作为MingGW的IDE。我正在尝试使用谷歌协议缓冲区,但我在建造原型时遇到了麻烦。
protobuf的自述文件说:
如果您正在使用Cygwin或MinGW,按照上面的Unix安装说明进行操作。
Unix指令说:
构建和安装C++协议缓冲区运行时和协议缓冲区编译器(protoc)执行以下内容:
$ ./configure $ make $ make check $ make install
我不知道如何在Windows中执行这些操作因为"configure"是Unix脚本我不知道如何执行它,也不知道其他命令。
有人能更详细地解释一下如何我可以在Windows上使用MinGW构建protobuf?
以下是对我有效的方法:
-
您需要使用mingw安装MSYS。这是一个类似unix的最小shell环境,允许您配置/制作大多数unix包。阅读关于如何安装的mingw文档(使用mingw-get或GUI安装程序)。
-
一旦你安装了MSYS,你应该在开始菜单中有一个快捷方式,名为"MinGW Shell"。这会打开一个带有bash的控制台。
-
将源tarball提取到您的MSYS主目录中。我在"D:\prog"中安装了mingw,所以目录是"D:\pog\mingw\msys \1.0\home\<username>"。你可以从shell提示符中说出你的msys用户名。完成后,您应该有一个目录"D:\prog\MinGW\msys\1.0\home\<username>\protobuf-2.4.1"。
-
在shell提示下,更改到protobuf目录:
cd protobuf-2.4.1
-
运行配置脚本(注意后引号):
./configure --prefix=`cd /mingw; pwd -W`
--prefix
参数确保protobuf安装在mingw目录树中,而不是MSYS目录中,因此您可以在MSYS外壳之外构建(例如,使用CodeBlocks…) -
运行制造商:
make
-
安装:
make install
-
就是这样。您现在应该能够使用protobuf编译您的项目了
你应该能够:- 从项目/makefiles调用
protoc
- CCD_ 8等
- 与
-lprotobuf
或-lprotobuf-lite
链接
- 从项目/makefiles调用
HTH
Peter
编辑:让这个更新一点。我试着用当前版本的MinGW和protobuf 2.5.0建立一台新的PC,这些都是我遇到的问题:
-
在开始菜单中没有"MinGW Shell"快捷方式
由于某些原因,目前的MinGW安装无法安装
但是在<Mingw home>msys1.0
中有一个msys.bat
,它带来了一个带有bash的控制台。在某个位置创建该批处理文件的快捷方式。 -
gcc不能在MSYS shell中工作
我必须手动运行安装后的批处理文件,并在那里回答问题。这将设置在MSYS环境中装载mingw目录的fstab条目
您需要运行<Mingw home>msys1.0postinstallpi.bat
-
我的Avira防病毒软件干扰了protobuf的编译
它抱怨生成的protocol.exe是"TR/Crypt.XPACK.Gen"特洛伊木马,并阻止访问该文件,导致构建损坏
在尝试启动protoc时,我收到了类似protoc:./.libs/lt-protoc.c:233: FATAL: couldn't find protoc.
的错误消息
我不得不再次禁用Avira实时扫描仪和make clean && make && make install
编辑#2:
这篇文章已经过时了,明已经不等于明了。在这个时代,我更推荐MSYS2,它带有一个ArchLinux的pacman软件包管理器端口,一个最近更好工作的(c++11 std::thread support!)mingw fork,用于32位和64位,还有一个protobuf软件包,你只需要安装它就可以了。
请点击此处下载!
希望这能有所帮助
Peter
在我的情况下,Peter的回答没有完全奏效,我使用了最新的MinGW 4.8.1+MSys分发版(在mingw-get
中选择了两个MSys包)。
我的问题是前缀实际上不起作用,我只能在C:MinGWmsys1.0local
中找到文件。然而,在将bin/include/libs文件夹复制到c:mingw,
之后,安装也对我起到了作用。
我遇到了同样的问题,我通过使用boost构建构建协议缓冲区来解决它。这很好,我可以为协议缓冲区提供一个jamfile。
不过,我仍然有问题的是扩展boost构建,使其从proto文件生成cpp源文件,但这是另一回事。
最新答案
以下是protobuf源代码发行版的当前版本的答案,即在Windows中使用protobuf for C++语言。(我的protobuf版本是21.4-libprotoc 3.21.4)
参考@peter remmers 的回答
步骤0:从发布页面下载protobuf zip文件。例如";protobuf-cpp-3.21.4.zip";
- 将其提取到要安装protobuf的路径
- 将";src";系统环境路径变量的文件夹路径。例如";C: \Protobuf路径\Protobuf-321.4\src"
步骤1:下载&安装msys2:https://www.msys2.org/
确保做到这些:
pacman -Syu
- 运行";MSYS2 MSYS";从"开始"菜单。使用
pacman -Syu
更新其余基本包 pacman -S --needed base-devel mingw-w64-x86_64-toolchain
步骤2:将mingw-bin文件的路径添加到系统的环境变量。
- 例如它是";C: \Path-To-Msys2\Msys2\mingw64\bin";以及";C: \Path-To-Msys2\Msys2\usr\bin"
- 通过检查终端中的g++版本:
g++ --version
进行确认(例如Mine是12.1.0)
步骤3:使用protobuf库设置C++运行时:
- 因此,返回msys2中的,安装protobuf的库:
pacman -S mingw-w64-x86_64-protobuf
。参考 - 现在,将目录更改为系统中安装protobuf的路径:例如cd"C: \Protobuf的路径\Protobuf-321.4"
- 运行protobuf:
./configure
的配置文件 - 运行
make
(如果aclocal等出现任何错误,请尝试运行pacman -S autoconf
,然后重试make
) - 运行
make install
第4步:就是这样。您现在应该能够使用protobuf编译您的项目了。
例如,使用protoc到cpp代码编译.proto文件&头文件:
- 用途:
protoc --cpp_out=$OUTDIR example.proto
- 两个文件,一个
pb.cc
&将生成CCD_ 31文件 - 编写一个cpp代码来使用该头文件并创建对象、填充数据等
- 从终端/PowerShell编译该cpp编写器文件,如下所示:
g++ -I "C:Path-To-Protobufprotobuf-3.21.4src" "Path-To-Codewriter.cpp" "Path-To-Codeexample.pb.cc" -o "Path-To-Codewriter.exe" -L "C:Path-To-Protobufprotobuf-3.21.4src.libs" -lprotobuf -pthread
(我想"-phread"在最后并不是很重要。)
注意(我遇到的问题):系统环境变量列表中例如mingw的路径顺序非常重要。
- Google protobuf 时间戳未声明标识符,在 Windows 上具有C++
- E/libc++abi:终止于类型为google::protobuf::FatalException的未捕获异常
- protobuf in C++ with dynamic binding for google::protobuf::M
- Google protobuf and Android NDK
- 防止客户端套接字程序崩溃CPP Google Protobuf
- 致命错误:google/protobuf/port_def.inc:没有这样的文件或目录 #include < google/protobuf/port_def.inc>
- 静态地将Google Protobuf lib链接到DLL库中
- 对Google :: Protobuf的未定义引用在ROS CPP中
- Google Protobuf 3:使用 CMAKE 构建时未定义的引用错误
- 通过Google Protobuf发送二进制文件数据
- 对Google :: ProtoBuf :: Internal :: empty_string_ [abi:cxx11]
- Google Protobuf基于C++的python实现的性能
- Google protobuf在解析字符串数据时在Android中崩溃
- C++Protobuf错误google::Protobuf::internal::kEmptyString错误
- 如何使用Google Protobuf实现地图结构
- 带有协议缓冲区的程序无法使用 MinGW-w64 编译:"undefined reference to google::protobuf:: ..."
- 无法在VS2015中正确链接Google Protobuf
- 从部分google protobuf消息中检索信息
- Google ProtoBuf序列化/反序列化
- encodeffloat在Google Protobuf中是如何工作的?