srpc icon indicating copy to clipboard operation
srpc copied to clipboard

windows下编译找不到protobuf

Open ChenTianSky opened this issue 3 years ago • 29 comments

我在windows下安装了protobuf,并加入了环境变量。在用cmake对srpc进行编译的时候报错,报错内容如下: CMake Error at src/CMakeLists.txt:17 (find_package): Could not find a package configuration file provided by "Protobuf" with any of the following names:

ProtobufConfig.cmake
protobuf-config.cmake

Add the installation prefix of "Protobuf" to CMAKE_PREFIX_PATH or set "Protobuf_DIR" to a directory containing one of the above files. If "Protobuf" provides a separate development package or SDK, be sure it has been installed.

ChenTianSky avatar Apr 25 '21 13:04 ChenTianSky

如果是命令行编译,执行CMake时加上“-DCMAKE_PREFIX_PATH=xxx”,后面的xxx替换成你自己的路径protobuf路径。 也可以使用vcpkg安装protobuf,vcpkg介绍:https://docs.microsoft.com/en-us/cpp/build/vcpkg?view=msvc-160 vcpkg install protobuf cmake执行时加上-DCMAKE_TOOLCHAIN_FILE=xxx/vcpkg/scripts/buildsystems/vcpkg.cmake即可(xxx替换成你自己的vcpkg路径)

dengjun101 avatar Apr 26 '21 03:04 dengjun101

我已经找到方法了,直接编译protobuf安装后是可以找到的。通过下载protobuf的二进制文件不行.相关的find_package找不到protobuf的情况也可以参考https://www.it610.com/article/1297843073920868352.htm。还有通过vcpkg安装protobuf也是可以找到的.另外需要注意的是cmake需要3.6之后才能通过find_package才能找到protobuf。相关内容在https://cmake.org/cmake/help/latest/module/FindProtobuf.html

ChenTianSky avatar Apr 26 '21 04:04 ChenTianSky

@dengjunplusplus 感谢大佬百忙之中回复

ChenTianSky avatar Apr 26 '21 04:04 ChenTianSky

感谢使用srpc哈。有什么问题随时反馈。 Linux版本的workflow功能更多更加稳定,上线推荐Linux版。windows版则性能更强,因为IOCP本身比epoll要快。

Barenboim avatar Apr 26 '21 08:04 Barenboim

有个老业务是在windows下跑的,周边一堆bat脚本,没有切换到linux的动力。现在想用sprc对这块的部分业务重构一下。目前还遇到一个问题. 按照文档说明,用cmake编译的时候,报错:CMake Error at src/CMakeLists.txt:31 (find_package): Could not find a package configuration file provided by "Workflow" with any of the following names:

WorkflowConfig.cmake
workflow-config.cmake

Add the installation prefix of "Workflow" to CMAKE_PREFIX_PATH or set "Workflow_DIR" to a directory containing one of the above files. If "Workflow" provides a separate development package or SDK, be sure it has been installed. 当我先去编译workflow的时候,编译错误: CMake Error at src/kernel/CMakeLists.txt:9 (message): IOService unsupported.

ChenTianSky avatar Apr 26 '21 12:04 ChenTianSky

@chentiannan 你好,Windows下依赖的workflow需要拉取windows分支~

holmes1412 avatar Apr 26 '21 12:04 holmes1412

@holmes1412 ok,整出来了,windows上编译还是挺麻烦的,我个人建议在readme上写一下windows的编译过程,有利于SPRC的推广,应该有一部分用户是需要用到windows的,感觉这个算SRPC的优势了。tars太重,brpc只支持linux

ChenTianSky avatar Apr 26 '21 12:04 ChenTianSky

@chentiannan 感谢认可!(开心到飞起~~~ 你这个issue也对我很有启发,我会把srpc在windows下的编译以及常见问题整理到一个FAQs 欢迎继续使用,有其他问题随时给我们反馈哦

holmes1412 avatar Apr 26 '21 12:04 holmes1412

在windows下编译出现问题: 1.编译srpc的时候CMakeLists中的要改成 if (WIN32) find_package(Protobuf REQUIRED) else () find_package(Protobuf CONFIG REQUIRED) endif () 才能编译通过,可能跟我环境有关?

2.编译sprc的时候报错: fatal error C1083: 无法打开包括文件: “zlib.h”: No such file or directory zip库我已经编译安装了,并且protobuf库也是用到了zip库

ChenTianSky avatar Apr 27 '21 14:04 ChenTianSky

我们的zlib默认是用的submodule,如果里这么下载srpc: git clone https://github.com/sogou/srpc --recursive 应该是引用我们下载下来的,而不是你系统里的。

Barenboim avatar Apr 27 '21 14:04 Barenboim

@dengjunplusplus @holmes1412

Barenboim avatar Apr 27 '21 14:04 Barenboim

是不是你clone的时候一直没有加--recursive? 需要加一下,然后 cd workflow git checkout windows 然后再编译。

Barenboim avatar Apr 27 '21 14:04 Barenboim

你好,单独讲一下find_package(...)的问题:

  • 加CONFIG是config模式: 通过后缀为<PackageName>Config.cmake或者package-name.config.cmake的文件进行依赖的;
  • 不加是module模式:找lib;

如果是WIN32,是要走的Config模式才能找到Protobuf~所以:

  1. 如果你要改了才能编译,说明pb的安装可能和预期不太一样;
  2. 而pb对zlib的依赖也是需要你手动安装才行,所以不能说明机器本身已经安装好了zlib。

holmes1412 avatar Apr 27 '21 14:04 holmes1412

@holmes1412 find_package(...)

  • 1.我在win32下面直接使用CONFIG模式,我cmake打印出来的xxxxx_DIR变量为空,去掉CONFIG模式就可以找到XXXX_DIR变量
message(WARNING "protobuf info:" "${Protobuf_FOUND} ${Protobuf_VERSION} ${Protobuf_INCLUDE_DIRS} ${Protobuf_LIBRARIES} ${Protobuf_PROTOC_LIBRARIES} ${Protobuf_LITE_LIBRARIES}")
上述语句在CONFIG下输入:
protobuf info:1 3.15.8.0

在非CONFIG下输出:
protobuf info:TRUE 3.15.8 C:/Program Files (x86)/protobuf/include
C:/Program Files (x86)/protobuf/lib/libprotobuf.lib C:/Program Files
(x86)/protobuf/lib/libprotoc.lib C:/Program Files
(x86)/protobuf/lib/libprotobuf-lite.lib
  • 2.PB对zlib的依赖是默认的。 set(protobuf_WITH_ZLIB_DEFAULT ON) option(protobuf_WITH_ZLIB "Build with zlib support" ${protobuf_WITH_ZLIB_DEFAULT})

ChenTianSky avatar Apr 27 '21 16:04 ChenTianSky

@chentiannan 那这样吧你先确认下你拉srpc代码下来是包括依赖库的么?即是否是recursive的?

holmes1412 avatar Apr 27 '21 16:04 holmes1412

@holmes1412 依赖库都拉下来了. 还是一样的

1>C:\Users\admin\Desktop\SRPC\srpc\src\compress\rpc_compress_gzip.h(22,10): fatal error C1083: 无法打开包括文件: “zlib.h”: No such file or directory
1>已完成生成项目“compress.vcxproj”的操作 - 失败。
2>LINK : fatal error LNK1181: 无法打开输入文件“C:\Users\admin\Desktop\SRPC\srpc\build\src\compress\compress.dir\Release\rpc_compress.obj”

然后我在centos下编译了,没问题能完好使用

ChenTianSky avatar Apr 27 '21 18:04 ChenTianSky

  • 我说一下我的编译流程吧:
1.我先编译的zlib
2.编译protobuf,带zlib依赖的
3.拉取srpc,然后切换到windows分支
4.编译workflow
5.编译sprc

问题就出在第5步上,第五步需要改cmake的那个config,不改则找不到protobuf的头文件,改了则报错找不到zlib.h,我在 rpc_compress_gzip.h的第22行看到了包含zlib,h。我的cmake版本是cmake version 3.17.20032601-MSVC_2。我的protobuf版本是3.15.8

ChenTianSky avatar Apr 29 '21 11:04 ChenTianSky

我们让windows端的同学看一看。之前没有遇到类似的问题。

Barenboim avatar Apr 29 '21 11:04 Barenboim

@chentiannan 按照下面的步骤可以很方便的编译 环境:Win10+VS2017 备注:如果要编译64位的,可以在vcpkg安装时指定x64-windows,CMake要加-G命令指定生成工具

  • 安装vcpkg,利用vcpkg安装protobuf、zlib、openssl cd D:\test git clone https://github.com/microsoft/vcpkg.git cd D:\test\vcpkg .\bootstrap-vcpkg.bat .\vcpkg.exe install zlib:x86-windows protobuf:x86-windows openssl:x86-windows

  • 下载代码 git clone https://github.com/sogou/srpc.git --recursive

  • 编译workflow cd D:\test\srpc\workflow git checkout windows cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=D:\test\vcpkg\scripts\buildsystems\vcpkg.cmake cmake --build build --config Debug cmake --build build --config Release

  • 编译srpc cd D:\test\srpc cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=D:\test\vcpkg\scripts\buildsystems\vcpkg.cmake cmake --build build --config Debug cmake --build build --config Release

  • 编译tutorial cmake -B buildt -S tutorial -DCMAKE_TOOLCHAIN_FILE=D:\test\vcpkg\scripts\buildsystems\vcpkg.cmake cmake --build buildt --config Debug cmake --build buildt --config Release

dengjun101 avatar Apr 30 '21 05:04 dengjun101

@dengjunplusplus

C:\Users\admin\Desktop\SRPC\srpc\_include\srpc\rpc_client.h(149,9): error C2039: "set_type": 不是 "WFComplexClientTask<sr
pc::RPCTYPEThriftHttp::REQ,srpc::RPCTYPEThriftHttp::RESP,bool>" 的成员 (编译源文件 C:\Users\admin\Desktop\SRPC\srpc\tutorial\tu
torial-11-trpc_pb_server.cc) [C:\Users\admin\Desktop\SRPC\srpc\buildt\trpc_pb_server.vcxproj]

ChenTianSky avatar May 07 '21 01:05 ChenTianSky

看起来你的srpc版本比workflow老啊?如果是clone --recursive最新代码,不应该有这个问题啊。

Barenboim avatar May 07 '21 03:05 Barenboim

ok,拉取最新的可以使用了。SPRC现在支持自定义二进制协议吗?类似于BRPC

ChenTianSky avatar May 07 '21 04:05 ChenTianSky

@chentiannan 你好~

  1. 目前srpc支持brpc协议;
  2. 如果你想要自定义二进制协议,可以直接使用workflow;
  3. 如果你想要自定义协议去发送IDL结构体,可以进行二次开发,可以参考src/message/文件夹下面添加即可,非常方便的~

holmes1412 avatar May 07 '21 04:05 holmes1412

ok,拉取最新的可以使用了。SPRC现在支持自定义二进制协议吗?类似于BRPC

您可以先看看workflow项目。自定义协议是这个文档: https://github.com/sogou/workflow/blob/master/docs/tutorial-10-user_defined_protocol.md

Barenboim avatar May 07 '21 07:05 Barenboim

建议写个Windows编译的说明,折腾死我了。 用: vcpkg install srpc 安装不行,编译报错。 用CMake Gui,好不容易创建好工程,编译通过,链接老是报错。 srpc.lib(rpc_message_srpc.obj) : error LNK2005: "public: int __cdecl google::protobuf::MessageLite::ByteSize(void)const " (?ByteSize@MessageLite@protobuf@google@@QEBAHXZ) 已经在 libprotobufd.lib(libprotobufd.dll) 中定义

环境是Win10, VS2019。

现在试试 dengjunplusplus 说的步骤,一步一步用vcpkg安装看看

ruoleng avatar Oct 27 '21 07:10 ruoleng

@ruoleng 你好,这个issue上面有具体的编译步骤https://github.com/sogou/srpc/issues/62#issuecomment-829840853 ,麻烦参考下~

holmes1412 avatar Oct 27 '21 10:10 holmes1412

@ruoleng 你好,这个issue上面有具体的编译步骤#62 (comment) ,麻烦参考下~

第四步编译srpc失败,项目compress编译失败,缺少依赖库的头文件

Crazing avatar Oct 28 '21 07:10 Crazing

@ruoleng 你好,这个 issue 上面有具体的编译步骤#62 (comment) ,麻烦参考下~

第四步编译 srpc 失败,项目 compress 编译失败,缺少依赖库的头文件

@Crazing 试一下:vcpkg install lz4 snappy 原因是这样的: 1、lz4和snappy是使用源代码编译的,上面的编译步骤是srpc还不支持vcpkg的时候写的步骤。 2、后来srpc支持vcpkg的时候,根据vcpkg的环境变量改用了vcpkg的lz4和snappy,使用vcpkg安装一下lz4和snappy应该就好了,详情见:https://github.com/sogou/srpc/pull/88/commits/98686d8c8b195283d028cd29e81ff1331507635d

dengjun101 avatar Oct 28 '21 08:10 dengjun101

@ruoleng 你好,这个issue上面有具体的编译步骤#62 (comment) ,麻烦参考下~

参考了,后面用vcpkg安装成功了,但是tutorial编译失败(vcpkg安装后的srpc 里面 _bin 路径不对,老是无法将.proto生成对应的pb跟srpc消息源文件),又从vcpkg中卸载srpc。

最后还是手动编译安装,尝试修改srpc-config.cmake 文件里面的_bin路径,才成功的。 但是srpc_generator.exe 有个bug: 绝对路径下的 .proto 文件生成 client.pb_skeleton.cc 和 server.pb_skeleton.cc 会报错,看输出是将 输入的 绝对路径给添加到输出目录里面了。

所以目前安装成功并正在使用的是:按照用 https://github.com/sogou/srpc/issues/62#issuecomment-829840853 的步骤 vcpkg安装了依赖项目(包括workflow),手动编译srpc项目。再手动设置tutorial的cmake-gui的依赖项目,没有用vcpkg中的,因为srpc是手动,用vcpkg安装的包( 带CMAKE_TOOLCHAIN_FILE)会找不到srpc(毕竟是手动安装的)。

中间还出现过手动编译后,cmake生成的 srpc-config.cmake 文件中的 set_and_check(SRPC_BIN_DIR "x'x'x")路径不对,老是vcpkg的。

对了,我安装的是x64的。 @holmes1412

在另外的电脑用vcpkg install srpc:x64-windows 安装成功,生成tutorial项目成功,但是编译失败。 确认是srpc_generator全路径的错误: C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.target s(241,5): error MSB8066: “Z:\src\vcpkg\buildtrees\srpc\src\v0.9.3-3a0c937de5.clean\buildttr\CMakeFiles\005300ff3c5 09a7e7b200cc80277de71\TURORIAL_GEN.rule;Z:\src\vcpkg\buildtrees\srpc\src\v0.9.3-3a0c937de5.clean\tutorial\CMakeLis ts.txt”的自定义生成已退出,代码为 3。 [Z:\src\vcpkg\buildtrees\srpc\src\v0.9.3-3a0c937de5.clean\buildttr\TURORIAL_ GEN.vcxproj]

ruoleng avatar Oct 29 '21 06:10 ruoleng