如何在Windows 10上构建gRPC C ++?

时间:2018-07-06 15:35:37

标签: c++ windows build cmake grpc

尝试使用Visual Studio 2015(C ++)和cmake在Windows 10上构建gRPC时,我没有遇到麻烦。

我已经从GitHub下载了grpc,并将其所有.gitmodules(及其.gitmodules等)解压缩,并将其解压缩到指定位置。当我cmgr grpc时,它抱怨在cares / cares中没有CMakeLists.txt。 grpc的.gitmodules指定cares-1_12_0,并且其中不包含CMakeLists.txt文件。该怎么办? Cares / cares的主版本包含CMakeLists.txt文件,因此我将其复制到-1_12_0树中。现在,它找到CMakeLists.txt,但是抱怨找不到的其他文件。 如果我只使用master版本的cares而不是1_12_0(希望现在解决所有不兼容的问题),那么我就不会再收到Cares投诉了。我发现可以解决护理问题的另一种方法是将c-ares-master.zip解压缩到grpc / third_part / cares / cares,然后在同一位置解压缩c-ares-cares-1_12_0.zip。我认为c-ares-master.zip将提供缺少c-ares-cares-1_12_0.zip的任何文件,而c-ares-cares-1_12_0.zip将用-覆盖具有相同名称的任何文件。 1_12_0版本-但这是一个好习惯(指定了特定版本后,在主版本上复制特定分支)? (我不使用git下载,因为它在这里不可用或尚未批准使用,因此我必须手动遍历依赖关系。)

下一个投诉来自protobuf 3.0.x:找不到repeat_field_reflection.h,但这仅是警告。

然后从基准测试中引发了一些错误,这些错误是关于找不到GTEST_LIBRARY,GTEST_INCLUDE_DIR和GTEST_MAIN_LIBRARY。

在尝试构建grpc之前,是否需要构建/安装所有这些子模块(从下至上)?不同模块的构建过程(以及生成的构建目录结构)之间的差异向我建议,该问题的答案应该为“否”,但我不确定。我知道cmake支持从单个根CMakeLists.txt开始(通过所有第三方依赖关系)向下构建源树的递归构建(即,一次执行cmake应该构建所有内容),因此对于cmake的这种能力是有意义的并使用依赖项的构建目录结构应保持一致。

我注意到grpc的.gitmodules需要protobuf 3.0.x,但是它也列出了bloaty,而bloaty的.gitmodules需要protobuf(大概是主版本)。在src树的不同部分使用不同版本的protobuf是否会产生问题(并构建两个版本的protobuf)?如果是这样,当树的不同部分需要相同模块的不同版本时,该怎么办?

至少在3个地方(grpc,bloaty,protobuf-master(bloaty要求,但protobuf-3.0.x不需要,grpc直接要求),则必须使用Googletest)。我应该将GTEST_ROOT指向何处,以及该模块如何与期望它位于自己的third_party分支下的模块一起使用?构建完成后如何安装Googletest?

cmake查找看起来像所有(或许多)标准C #include文件的文件。找到了很多,但没有找到很多(我是从VS2015 x64本机工具命令提示符构建的,因此适用的LIB和INCLUDE路径应该可用;我已经看过它们,并且看起来很合理。)。如果它在默认情况下搜索所有这些内容,那么我猜测找不到某些内容应该不是问题(如果grpc或其依赖项未使用它们),因此我没有追究它们。但是,找不到的是pthread.h(据我了解,至少有一个模块使用pthread,但是cmake输出的下一行是“ Found Threads:TRUE”)。另一个令人不安的发现是“-检查off64_t的大小-失败”(似乎该值对于定义protobuf结构可能很重要。)CMake还运行许多测试。有些成功;其他人没有。我应该担心测试失败(哪些失败)吗?

我还注意到,这些模块中的许多模块几乎每天都在变化,所以我想到对GitHub存储库中主版本的依赖可能随时中断。最近有没有人为Windows构建C ++ gRPC?

任何帮助或建议将不胜感激。

1 个答案:

答案 0 :(得分:1)

无法直接向 roger 发表评论,因为我缺少所需的 karma 点,但我也能够在 Windows 10 上遇到同样的问题。这在 CMAKE 3.14 中有效,然后在 3.19 中我被迫中断出于另一个原因更新我的 Jenkins 服务器。

当我使用以下内容时(联网的,不是这个答案的首选,但为了安心而首选),它工作可靠;如果您在构建机器上可以访问网络,请使用它。

# Builds gRPC based on GIT checked-out sources
ExternalProject_Add(grpc
  PREFIX grpc
  SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/path/to/grpc"
  CMAKE_CACHE_ARGS
        -DgRPC_INSTALL:BOOL=ON
        -DgRPC_BUILD_TESTS:BOOL=OFF
        -DgRPC_BUILD_GRPC_RUBY_PLUGIN:BOOL=OFF
        -DgRPC_PROTOBUF_PROVIDER:STRING=module
        -DgRPC_PROTOBUF_PACKAGE_TYPE:STRING=CONFIG
        -DgRPC_ZLIB_PROVIDER:STRING=module
        -DgRPC_CARES_PROVIDER:STRING=module
        -DgRPC_SSL_PROVIDER:STRING=module
        -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_CURRENT_BINARY_DIR}/grpc
  DEPENDS c-ares protobuf zlib
)

如果你不能这样做,我不得不通过单独构建每个组件,跟踪它们的安装位置,然后将它们作为参数添加到 ExternalProjectAdd 来做一些困难的事情...

# Builds c-ares project from the git submodule.
ExternalProject_Add(c-ares
  PREFIX c-ares
  SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/path/to/cares"
  CMAKE_CACHE_ARGS
        -DCARES_SHARED:BOOL=OFF
        -DCARES_STATIC:BOOL=ON
        -DCARES_STATIC_PIC:BOOL=ON
        -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_CURRENT_BINARY_DIR}/c-ares
)

# Builds protobuf project from the git submodule.
ExternalProject_Add(protobuf
  PREFIX protobuf
  SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/path/to/protobuf/cmake"
  CMAKE_CACHE_ARGS
        -Dprotobuf_BUILD_TESTS:BOOL=OFF
        -Dprotobuf_WITH_ZLIB:BOOL=OFF
        -Dprotobuf_MSVC_STATIC_RUNTIME:BOOL=OFF
        -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_CURRENT_BINARY_DIR}/protobuf
)

# Builds zlib project from the git submodule.
ExternalProject_Add(zlib
  PREFIX zlib
  SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/path/to/zlib"
  CMAKE_CACHE_ARGS
        -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_CURRENT_BINARY_DIR}/zlib
)

# the location where protobuf-config.cmake will be installed varies by platform

set(_FINDPACKAGE_PROTOBUF_CONFIG_DIR "${CMAKE_CURRENT_BINARY_DIR}/protobuf/cmake")

# if OPENSSL_ROOT_DIR is set, propagate that hint path to the external projects with OpenSSL dependency.
set(_CMAKE_ARGS_OPENSSL_ROOT_DIR "-DOPENSSL_ROOT_DIR:PATH=${OPENSSL_ROOT_DIR}")

# Builds gRPC based on locally checked-out sources and set arguments so that all the dependencies
# are correctly located.
ExternalProject_Add(grpc
  PREFIX grpc
  SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/path/to/grpc"
  CMAKE_CACHE_ARGS
        -DgRPC_INSTALL:BOOL=ON
        -DgRPC_BUILD_TESTS:BOOL=OFF
        -DgRPC_BUILD_GRPC_RUBY_PLUGIN:BOOL=OFF
        -DgRPC_PROTOBUF_PROVIDER:STRING=package
        -DgRPC_PROTOBUF_PACKAGE_TYPE:STRING=CONFIG
        -DProtobuf_DIR:PATH=${_FINDPACKAGE_PROTOBUF_CONFIG_DIR}
        -DgRPC_ZLIB_PROVIDER:STRING=package
        -DZLIB_ROOT:STRING=${CMAKE_CURRENT_BINARY_DIR}/zlib
        -DgRPC_CARES_PROVIDER:STRING=module
        -Dc-ares_DIR:PATH=${CMAKE_CURRENT_BINARY_DIR}/c-ares/lib/cmake/c-ares
        -DgRPC_SSL_PROVIDER:STRING=package
        ${_CMAKE_ARGS_OPENSSL_ROOT_DIR}
        -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_CURRENT_BINARY_DIR}/grpc
  DEPENDS c-ares protobuf zlib
)