目录
1.2 编译libprotobuf和libprotoc两个项目
由于老项目用的是vs2005 C++,需要引入protobuf,记录下开发过程。
1 vs2005里使用protobuf
1.1 protobuf版本选择
由于从protobuf3.x开始,要求的vs编译器最低版本是vs2008,所以我们选择2.6.1版本,github上下载编译即可。
1.2 编译libprotobuf和libprotoc两个项目
编译时注意选择运行时库的选择:
编译libprotoc的目的是为了使用protoc.exe来编译xx.proto文件生成对应的.h和.cc文件,你也可以直接下载编译好的protoc.exe.
1.3 使用protobuf
使用前,我们需要先生成对应的.h和.cc文件,命令如下:
.\bin\protoc.exe --proto_path=./ protos/pvcs.proto --cpp_out=./cppFiles
然后把.h和.cc文件加入到项目,在vs项目里设置好libprotobuf库的头文件和库文件路径即可。
2 go里使用protobuf
2.1 编译proto文件
.\bin\protoc.exe --proto_path=./ protos/pvcs.proto --go_out=./goFiles
生成对应的go文件:pvcs.pb.go
注意:protobuf 2.6.1针对go生成的结构体成员都是指针类型的,例如:
proto文件内容:
message PVCSMsgHead{
int32 cmd = 1;
int32 reserved = 2;
int32 size = 3;
}
生成的pvcs.pb.go里的对应信息如下:
type PVCSMsgHead struct {
Cmd *int32 `protobuf:"varint,1,req,name=cmd" json:"cmd,omitempty"`
Reserved *int32 `protobuf:"varint,2,req,name=reserved" json:"reserved,omitempty"`
Size *int32 `protobuf:"varint,3,req,name=size" json:"size,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
2.2 引入编译出的go文件
目前我看下来go在import时不支持相对路径,需要通过replace指令来进行替换引用。
比如我的项目结构如下:
GOPATH=SSO_PhoneVerifyCodeSrvV2, 代码在src目录,proto文件在protos目录,src目录下通过go mod init来管理依赖。
那么我们需要做以下三件事:
1)在src目录下的go.mod里加入replace指令:replace protos => ../protos
2) 在protos目录通过go mod init xx,也创建go.mod文件。
3) 在你项目的go文件import这个protos包和protobuf包,如下所示:
package main
import (
"bytes"
"encoding/binary"
"fmt"
"net"
"strconv"
"unsafe"
pvcs "protos"
"github.com/golang/protobuf/proto"
)
这样你就可以在你的go项目里来使用pvcs.pb.go里的成员了。如下例子代码:
newRequestInfo := &pvcs.PVCSLoginRequest{}
err := proto.Unmarshal(data, newRequestInfo)
if err != nil {
fmt.Println("err:", err)
return
}
fmt.Println("n:", *newRequestInfo.N)