gRPC Windows編譯應用

gRPC Windows編譯

從github上clone出來後進行cmake的編譯,參考上面的文檔,須要注意的點:java

  • 必須安裝全部的依賴,包括Perl,Go,YASM,Git,CMake
  • 不要使用--recursive來遞歸clone,由於牆的緣由會失敗
  • 因此子模塊的下載請使用:git submodule update --init
  • 使用cmake生成VS solution進行構建
  • 安裝請在VS中生成INSTALL項目便可,默認安裝到C盤的Program Files目錄

Q:奇怪的是grpc.lib居然沒有安裝到目錄下,不知道爲何?python

因此我只能手動將Release目錄下的lib文件都拷貝到安裝目錄下了c++

example的使用

依賴與庫

  • 須要使用grpc的include,在安裝目錄下有git

    C:\Program Files %28x86%29\grpc\includegithub

  • 須要使用protobuf的include,在安裝目錄下有ruby

  • 依賴庫的路徑:C:\Program Files %28x86%29\grpc\lib編碼

  • 依賴的庫有:libprotobuf.lib;grpc++_unsecure.lib;grpc_unsecure.lib;gpr.lib;zlibstatic.lib;ws2_32.lib加密

    • libprotobuf.lib:必須的庫
    • grpc++.lib: 使用SSL加密的庫,C++須要,依賴ssl
    • grpc++_cronet.lib
    • grpc.lib:使用SSL加密的庫,C核心庫,依賴ssl
    • grpc_cronet.lib:
    • gpr.lib:必須的庫,grpc庫依賴
    • zlibstatic.lib:zlib壓縮庫,須要
    • ssl.lib:openssl庫
    • grpc++_unsecure.lib: 不使用ssl加密的庫,依賴grpc_unsecure.lib
    • grpc_unsecure.lib:不適用ssl加密的核心庫

proto文件的編譯

protoc --proto_path=IMPORT_PATH --cpp_out=DST_DIR --java_out=DST_DIR --python_out=DST_DIR --go_out=DST_DIR --ruby_out=DST_DIR --javanano_out=DST_DIR --objc_out=DST_DIR --csharp_out=DST_DIR path/to/file.proto
  • 編譯Message C++實現
    protoc -I ./ --cpp_out=./ helloworld.proto
  • 編譯Service/grpc C++實現: 須要使用插件grpc_cpp_plugin.exe
    protoc -I ./ --grpc_out=. --plugin=protoc-gen-grpc=C:\bin\grpc_cpp_plugin.exe helloworld.proto

可能出現的錯誤

  • "Please compile grpc with _WIN32_WINNT of at least 0x600 (aka Windows Vista)"插件

    須要添加編譯宏:-D_WIN32_WINNT=0x600code

  • error C4146: 一元負運算符應用於無符號類型,結果仍爲無符號類型

    在【項目-屬性-C/C++-高級】中修改【禁用特定警告】,添加 4146.

  • error LNK2038: 檢測到「RuntimeLibrary」的不匹配項: 值「MT_StaticRelease」不匹配值「MD_DynamicRelease」(helloworld.grpc.pb.obj 中)

    只能使用在編譯grpc時生成的protobuf庫,不能使用不一樣版本的。

  • error LNK2001: 沒法解析的外部符號 __imp__WSAStartup

    • 在添加頭文件處,添加引用:#pragma comment(lib,"ws2_32.lib")
    • 或者在庫輸入中添加:ws2_32.lib的依賴
  • warning C4819: 該文件包含不能在當前代碼頁(936)中表示的字符。請將該文件保存爲 Unicode 格式以防止數據丟失

    這個錯誤會致使文件中的中文沒法正常解析,從而致使中文後面的符號出現未定義符號之類的一大堆錯誤。

    解決方法就是將文件的編碼格式改成:【Unicode(UTF-8 帶簽名)-代碼頁65001】

  • 無效字符類型傳輸:protobuf string只支持UTF-8和ASCII

    若是中文編碼是GBK編碼的話,有兩種方法:

    • 轉換成UTF8
    • 使用bytes類型,而不是string類型
相關文章
相關標籤/搜索