Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

windows下编译找不到protobuf #62

Open
ChenTianSky opened this issue Apr 25, 2021 · 29 comments
Open

windows下编译找不到protobuf #62

ChenTianSky opened this issue Apr 25, 2021 · 29 comments

Comments

@ChenTianSky
Copy link

我在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.

@dengjun101
Copy link
Contributor

如果是命令行编译,执行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路径)

@ChenTianSky
Copy link
Author

我已经找到方法了,直接编译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
Copy link
Author

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

@Barenboim
Copy link
Contributor

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

@ChenTianSky
Copy link
Author

有个老业务是在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.

@holmes1412
Copy link
Contributor

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

@ChenTianSky
Copy link
Author

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

@holmes1412
Copy link
Contributor

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

@ChenTianSky
Copy link
Author

在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库

@Barenboim
Copy link
Contributor

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

@Barenboim
Copy link
Contributor

@Barenboim
Copy link
Contributor

Barenboim commented Apr 27, 2021

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

@holmes1412
Copy link
Contributor

holmes1412 commented Apr 27, 2021

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

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

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

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

@ChenTianSky
Copy link
Author

@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})

@holmes1412
Copy link
Contributor

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

@ChenTianSky
Copy link
Author

@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
Copy link
Author

  • 我说一下我的编译流程吧:
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

@Barenboim
Copy link
Contributor

Barenboim commented Apr 29, 2021

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

@dengjun101
Copy link
Contributor

@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

@ChenTianSky
Copy link
Author

@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]

@Barenboim
Copy link
Contributor

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

@ChenTianSky
Copy link
Author

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

@holmes1412
Copy link
Contributor

@chentiannan 你好~

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

@Barenboim
Copy link
Contributor

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

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

@ruoleng
Copy link

ruoleng commented Oct 27, 2021

建议写个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安装看看

@holmes1412
Copy link
Contributor

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

@Crazing
Copy link

Crazing commented Oct 28, 2021

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

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

@dengjun101
Copy link
Contributor

@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应该就好了,详情见:98686d8

@ruoleng
Copy link

ruoleng commented Oct 29, 2021

@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 会报错,看输出是将 输入的 绝对路径给添加到输出目录里面了。

所以目前安装成功并正在使用的是:按照用 #62 (comment) 的步骤 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]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

6 participants