天天看點

protoc支援c_[cmake 2.x]解析protobuf模版(*.proto)并建構其C++代碼

有兩種方式,一種是使用cmake自帶的FindProtobuf module,這個子產品内部內建了生成代碼指令的操作,用起來最友善;另外一種是将protoc指令內建到CMakeLists.txt中,這種要麻煩點。

自帶的FindProtobuf

方法如下:

使用cmake自帶的FindProtobuf解析protobuf

但是我按照文章試了一遍,結果不成功,最後nmake錯誤時提示:

NMAKE : fatal error U1073: don't know how to make 'E:\Source\proto-build\PROTOBUF_PROTOC_EXECUTABLE-NOTFOUND'

Stop.

NMAKE : fatal error U1077: '"D:\Program_Filesx86\Microsoft Visual Studio 14.0\VC\BIN\amd64\nmake.exe"' : return code '0x2'

Stop.

NMAKE : fatal error U1077: '"D:\Program_Filesx86\Microsoft Visual Studio 14.0\VC\BIN\amd64\nmake.exe"' : return code '0x2'

Stop.

可能原因:

上文是在gcc編譯器下進行的,而我是在windows nmake上進行的,不知道是不是平台問題的差異。

另外我用的版本是3.5,上文用的是2.8,版本差異也可能是一個原因。

內建protoc指令來建構

cmake自動生成protobuf代碼

這個我還沒親自試過,不知道在nmake是否可行。

不過我手動執行protoc生成c++代碼後,再執行cmake建構指令将這些C++代碼編譯程靜态庫lib是成功的。

注意事項:

如果proto檔案中使用了import,也就是一個proto引用了另外一個proto,那麼第一種方法FindProtobuf就會出錯,然後你還是得中第二種方法,即将protoc指令內建到CMakeLists.txt

另外import報錯的問題在3.0版本已經修複,可以直接使用其内部內建的FindProtobuf直接生成,有import也能正常解析并編譯:http://aigo.iteye.com/blog/2295228

其他參考:

CMake and FindProtobuf(講的不錯,提到了一些容易疏忽的cmake細節特性)

最原始的手動建構方式

示例的目錄結構如下:

proto-mylib

|—— build/           #空檔案夾,用于cmake編譯生成

|—— include/

|—— google/      #protobuf頭檔案

|—— lib/

|—— libprotobuf-lite.lib  #windows靜态庫

|—— src/

|—— test.pb.h       #protoc生成代碼

|—— test.pb.cc       #protoc生成代碼

|—— CMakeLists.txt

CMakeLists.txt内容為(注:我這裡用的是3.5,2.x版本沒試過):

cmake_minimum_required(VERSION 3.5)

SET(ROOT_PATH ".")

SET(PROTOC_GEN_DIR ${ROOT_PATH}/src)

SET(THIRD_LIB_DIR ${ROOT_PATH}/lib)

SET(THIRD_INCLUDE_DIR ${ROOT_PATH}/include)

include_directories(${THIRD_INCLUDE_DIR})

link_directories(${THIRD_LIB_DIR})

file(GLOB PROTO_SRCS ${PROTOC_GEN_DIR}/*.cc)

file(GLOB PROTO_HEADERS ${PROTOC_GEN_DIR}/*.h)

add_library(proto-mylib STATIC ${PROTO_SRCS})

target_link_libraries(proto-mylib libprotobuf-lite)

執行指令:

cmake -G"NMake Makefiles" -DCMAKE_BUILD_TYPE=Release ..

nmake

這樣就得到了一個靜态庫:proto-mylib.lib