環境:Win7_64旗艦版,VS2013
最近在研究Webkit,已經編譯成功,接下來就是Javascript與c++如何傳輸數據,立刻就想到了protobuf,但是谷歌不支持Javascript,百度了很久,終於找到了
這篇文章:http://blog.csdn.net/xnn2s/article/details/8580917
一、首先下載protobuf,進行編譯生成libprotobuf.dll、libprotoc.dll、protoc.exe文件,網上有很多非常詳細的教程,這里不多說。
二、下載protobuf-plugin-closure,可以到github上進行下載,我下載的是protobuf-plugin-closure-rethinkdb。
三、接下來就是編譯插件了(詳見README文件)
1、將編譯protouf后生成的libprotobuf.dll、libprotoc.dll、protoc.exe文件拷貝到protobuf-plugin-closure-rethinkdb文件夾下。
2、然后將protobuf庫下的四個文件拷貝到protobuf-plugin-closure-rethinkdb文件夾下,這四個文件分別是
plugin.pb.h plugin.pb.cc plugin.h plugin.cc
3、使用protoc將javascript_package.proto、int64_encoding.proto生成如下文件
int64_encoding.pb.h int64_encoding.pb.cc javascript_package.pb.h javascript_package.pb.cc
4、使用VS2013創建控制台應用程序,項目名為"protoc-gen-js"
將以下文件加入到項目中
js/code_generator.h js/code_generator.cc js/int64_encoding.pb.h js/int64_encoding.pb.cc js/javascript_package.pb.h js/javascript_package.pb.cc js/protoc_gen_js.cc plugin.h plugin.cc plugin.pb.h plugin.pb.cc
編譯"protoc-gen-js""項目生成protoc-gen-js.exe文件
5、使用VS2013創建控制台應用程序"protoc-gen-ccjs"
將以下文件加入到項目中
js/int64_encoding.pb.h js/int64_encoding.pb.cc js/javascript_package.pb.h js/javascript_package.pb.cc plugin.h plugin.cc plugin.pb.h plugin.pb.cc ccjs/code_generator.h ccjs/code_generator.cc ccjs/protoc_gen_ccjs.cc
編譯"protoc-gen-ccjs""項目生成protoc-gen-ccjs.exe文件
ccjs/code_generator.cc文件有一個錯誤,需要在ccjs/code_generator.h中加入宏#if _MSC_VER #define snprintf _snprintf #endif
6、使用插件從proto文件生成.js和.cc文件,這樣Javascript和c++就可以使用了
protoc的命令行參數非常坑爹,不過幸好有源碼,可以看到里面的一些規則
打開cmd,進入到protobuf-plugin-closure-rethinkdb文件夾下(此文件夾下有protoc.exe)
protoc --plugin=protoc-gen-js=bin/protoc-gen-js.exe --plugin=protoc-gen-ccjs=bin/protoc-gen-ccjs.exe -I E:\protobuf-plugin-closure-rethinkdb\ -I E:\protobuf-2.5.0\src\ --js_out=.\out\ --cpp_out=.\out\ -- ccjs_out=.\out\E:\Desktop\OpenSource\protobuf-plugin-closure-rethinkdb\protobuf-plugin-closure-rethinkdb\js\test.proto
--plugin=protoc-gen-js=bin/protoc-gen-js.exe 表示 --plugin=插件名稱=插件路徑
-I E:\protobuf-plugin-closure-rethinkdb\ -I E:\protobuf-2.5.0\src\表示proto文件的路徑
--js_out=.\out\ 表示在當前目錄下的out文件夾下生成js文件
--cpp_out=.\out\ 表示在當前目錄下的out文件夾下生成.h和.cc文件
注意:
1、插件的名稱格式必須是protoc-gen-XX,且與--XX_out對應,否則生成失敗
2、--cpp_out=.\out --ccjs_out=.\out順序不能打亂,否則將提示"Tried to insert into file that doesn't exist."錯誤(跟蹤發現protoc-gen-ccjs.exe插件只是在原有.h和.cc文件中插入了幾個函數,這個錯誤用了我幾個小時^^)
3、使用插件生成的.cc文件后,會有很多錯誤
用於c++不支持直接輸入二進制數,將0b開始的數字替換成十六進制數據(char)0x。
使用NextCppCharToJsonEscapedBuffer函數有個問題,將
if (snprintf(json_escaped_buf,
sizeof(json_escaped_buf),
"\\u%04lx",
val) != 6) {
RTN_FALSE;
}
替換為
if (snprintf(json_escaped_buf,
7,
"\\u%04lx",
val) != 6) {
RTN_FALSE;
}
因為在c++里面,數組作為形參時和指針沒什么區別,使用sizeof不能計算數組的大小。