介绍
gRPC 编译依赖 : openssl
etcd-cpp-apiv3 编译依赖: openssl grpc boost cpprestsdk
c++ 最不友好的地方,就是编译,非常耗时。一两天的时间,就花在编译上!
编译 openssl
编译工具 | 说明 |
---|---|
perl | https://strawberryperl.com/download/5.32.1.1/strawberry-perl-5.32.1.1-64bit.msi |
nmake | Visual Studio 2019 |
编译过程:
git clone -b OpenSSL_1_1_1k https://github.com/openssl/openssl.git
cd openssl
mkdir my_build_out
perl Configure VC-WIN64-ARM no-shared --prefix=C:\tmp1\openssl\my_build_out
nmake
nmake install
编译 grpc
编译工具 | 说明 |
---|---|
cmake | https://github.com/Kitware/CMake/releases/download/v3.21.0-rc1/cmake-3.21.0-rc1-windows-x86_64.msi |
vs | Visual Studio 2019 |
编译过程:
git clone -b v1.38.0 https://github.com/grpc/grpc.git
cd grpc
git submodule update --init
mkdir my_build_out
mkdir cmake\build
cd cmake\build
cmake -DCMAKE_INSTALL_PREFIX=C:\tmp1\grpc\my_build_out ^
-DgRPC_SSL_PROVIDER="package" ^
-DOPENSSL_ROOT_DIR=C:\tmp1\openssl ^
../..
用 vs 打开 cmake\build\grpc.sln 编译
编译 boost
REM wget https://boostorg.jfrog.io/artifactory/main/release/1.74.0/source/boost_1_74_0.zip
REM unzip boost_1_74_0.zip
cd boost_1_74_0
bootstrap.bat
mkdir my_build_out
b2 --prefix=C:\tmp1\boost_1_74_0\my_build_out --build-type=complete ^
--with-system ^
--with-thread ^
--with-random ^
--with-chrono ^
--with-date_time ^
--with-atomic ^
--with-filesystem ^
--with-regex ^
install
–build-type=complete ,会生成 /MT、/MTd、/MD、/MDd 版本
编译 cpprestsdk
编译工具 | 说明 |
---|---|
cmake | https://github.com/Kitware/CMake/releases/download/v3.21.0-rc1/cmake-3.21.0-rc1-windows-x86_64.msi |
vs | Visual Studio 2019 |
编译过程:
git clone -b v2.10.18 https://github.com/microsoft/cpprestsdk.git
cd cpprestsdk
mkdir my_build_out
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=C:\tmp1\cpprestsdk\my_build_out ^
-DCPPREST_EXCLUDE_WEBSOCKETS=ON ^
-DBUILD_SHARED_LIBS=OFF ^
-DZLIB_INCLUDE_DIRS=C:\tmp1\grpc\my_build_out\include ^
-DZLIB_LIBRARY=C:\tmp1\grpc\my_build_out\lib\zlib.lib ^
-DCMAKE_CXX_FLAGS="-D_NO_PPLXIMP -D_NO_ASYNCRTIMP /EHsc" ^
..
用 vs 打开 build\cpprestsdk-root.sln 编译
需要添加 -D_NO_PPLXIMP -D_NO_ASYNCRTIMP /EHsc
编译选项,不然链接时会有问题!
编译 etcd-cpp-apiv3
编译工具 | 说明 |
---|---|
cmake | https://github.com/Kitware/CMake/releases/download/v3.21.0-rc1/cmake-3.21.0-rc1-windows-x86_64.msi |
vs | Visual Studio 2019 |
编译过程:
git clone https://github.com/etcd-cpp-apiv3/etcd-cpp-apiv3.git
cd etcd-cpp-apiv3
mkdir my_build_out
mkdir build
mkdir proto\google\protobuf
copy /Y C:\tmp1\grpc\my_build_out\include\google\protobuf\descriptor.proto C:\tmp1\etcd-cpp-apiv3\proto\google\protobuf\
cd build
cmake -DCMAKE_INSTALL_PREFIX=C:\tmp1\etcd-cpp-apiv3\my_build_out ^
-DBOOST_INCLUDEDIR=C:\tmp1\boost_1_74_0\my_build_out\include ^
-DBOOST_LIBRARYDIR=C:\tmp1\boost_1_74_0\my_build_out\lib ^
-DProtobuf_INCLUDE_DIR=C:\tmp1\grpc\third_party\protobuf\src ^
-DProtobuf_LIBRARIES=C:\tmp1\grpc\my_build_out\lib\libprotobuf.lib ^
-DProtobuf_PROTOC_EXECUTABLE=C:\tmp1\grpc\my_build_out\bin\protoc.exe ^
-DGPR_LIBRARY=C:\tmp1\grpc\my_build_out\lib\gpr.lib ^
-DGRPC_LIBRARY=C:\tmp1\grpc\my_build_out\lib\grpc.lib ^
-DGRPC_INCLUDE_DIR=C:\tmp1\grpc\my_build_out\include ^
-DGRPC_GRPC++_REFLECTION_LIBRARY=C:\tmp1\grpc\my_build_out\lib\grpc++_reflection.lib ^
-DGRPC_GRPC++_LIBRARY=C:\tmp1\grpc\my_build_out\lib\grpc++.lib ^
-DGRPC_CPP_PLUGIN=C:\tmp1\grpc\my_build_out\bin\grpc_cpp_plugin.exe ^
-DCPPREST_INCLUDE_DIR=C:\tmp1\cpprestsdk\my_build_out\include ^
-DCPPREST_LIB=C:\tmp1\cpprestsdk\my_build_out\lib\cpprest142_2_10.lib ^
-DOPENSSL_ROOT_DIR=C:\tmp1\openssl ^
-DCMAKE_CXX_FLAGS="-D_NO_PPLXIMP -D_NO_ASYNCRTIMP -IC:\tmp1\grpc\my_build_out\include -IC:\tmp1\grpc\third_party\abseil-cpp" ^
-DBUILD_SHARED_LIBS=OFF ^
..
用 vs 打开 build\cpprestsdk-root.sln 编译
其他说明
- 自己工程需要添加编译选项:
-D_NO_PPLXIMP -D_NO_ASYNCRTIMP
- proto 定义文件中有中文,生成的 *.grpc.pb.cc 文件,在 vs2019 下会编译错误。把操作系统编码设置成默认 utf-8
- windows 下 c 运行时库有 /MT、/MTd、/MD、/MDd 4 种,以上编译要对好版本