如何为C / C ++构建最小静态版本的grpc

时间:2018-03-09 17:38:53

标签: grpc

需要使用静态库构建一个grpc版本。没有插件支持,也没有构建共享库。我似乎无法找到办法。我也使用自定义版本的SSL和系统zlib并设置了所需的

cmake .. -DCMAKE_BUILD_TYPE=Release -DgRPC_ZLIB_PROVIDER=package -DgRPC_SSL_PROVIDER=package -DOPENSSL_ROOT_DIR=<path to my ssl root>

在CentOS7上运行虽然看起来它应该是一个与平台无关的请求/功能。

我不需要进行make install,因为我们将二进制文件检查到源代码树中,以便我们的项目的其余部分将构建,然后链接这个静态版本的grpc和我们的自定义ssl。

2 个答案:

答案 0 :(得分:0)

首先,我试图为容器构建自己的最小C / C ++ protobuf / grpc设置找到答案。我不需要所有其他语言的所有支持。

第二,将二进制文件检查到源代码存储库中?真?为此,您应该使用诸如bintray,artifactory,nexus等之类的东西。

答案 1 :(得分:0)

我有一个类似的问题,尽管就我而言,我试图弄清楚如何在Windows中进行操作。我需要静态库,但链接到动态运行时(/MD/MT。)

试图自己构建gRPC。最终走了vcpkg路线,这好多了,尤其是在Windows中使用开源软件时!

但是,在Windows上,vcpkg在默认情况下仅构建两件事:完全动态或完全静态。我想要的是将静态库链接到动态运行时。为此,您必须创建自己的三元组。这是我的操作方式:

git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
bootstrap-vcpkg.bat
vcpkg integrate install
vcpkg integrate powershell
cd triplets
copy x64-windows.cmake x64-windows-mixed.cmake

编辑x64-windows-mixed.cmake,使其包含以下3行:

set(VCPKG_TARGET_ARCHITECTURE x64)
set(VCPKG_CRT_LINKAGE dynamic)
set(VCPKG_LIBRARY_LINKAGE static)

然后安装并构建gRPC和protobufs:

cd ..
vcpkg.exe install grpc:x64-windows-mixed protobuf:x64-windows-mixed

如果您使用的是Linux,则默认的三元组可能已经正确,因为x64-linux.cmake文件默认为:

set(VCPKG_TARGET_ARCHITECTURE x64)
set(VCPKG_CRT_LINKAGE dynamic)
set(VCPKG_LIBRARY_LINKAGE static)
set(VCPKG_CMAKE_SYSTEM_NAME Linux)

一旦所有内容都内置在vcpkg中,您将需要自定义项目的cmake文件以查找正确的软件,并链接正确的.a文件。我没有在Linux上尝试此操作,但是在Windows中,我的项目包括以下内容:

FIND_PACKAGE ( protobuf CONFIG  REQUIRED )
FIND_PACKAGE ( c-ares   CONFIG  REQUIRED )
FIND_PACKAGE ( gRPC     CONFIG  REQUIRED )
FIND_PACKAGE ( ZLIB             REQUIRED )
FIND_PACKAGE ( OpenSSL          REQUIRED )
FIND_PACKAGE ( Threads          REQUIRED )

为了确保我具有正确的vcpkg include目录,我使用了以下方法:

FIND_PATH ( SYSTEM_INCLUDE_DIR zlib.h )
INCLUDE_DIRECTORIES ( ${SYSTEM_INCLUDE_DIR} )

然后在链接时,我确保TARGET_LINK_LIBRARIES包含以下内容:

PUBLIC Threads::Threads
protobuf::libprotoc protobuf::libprotobuf protobuf::libprotobuf-lite
gRPC::gpr gRPC::grpc gRPC::grpc++ gRPC::grpc_cronet
c-ares::cares c-ares::cares_static
OpenSSL::SSL OpenSSL::Crypto
ZLIB::ZLIB )

第一次运行cmake时,请记住指定工具链文件和前缀路径。就Windows而言,我还必须告诉它要使用哪个三元组。该命令如下所示:

mkdir build
cd build
cmake \
  -DCMAKE_BUILD_TYPE=Debug \
  -DCMAKE_TOOLCHAIN_FILE=/src/vcpkg/scripts/buildsystems/vcpkg.cmake \
  -DCMAKE_PREFIX_PATH=/src/vcpkg/installed/x64-windows-mixed \
  -DVCPKG_TARGET_TRIPLET=x64-windows-mixed \
  ..

(最后一个命令在Windows中无法以这种方式分解,我在这里只是这样做是为了帮助显示我要传入的参数。)