笔者在用bazel 编译 protobuf的项目的时候,参考一些csdn上的项目发现都无法正常使用,因此我整理了一个能正常使用的demo,供大家参考~
protoc --version
libprotoc 21.12
bazel --version
bazel 6.0.0
WORKSPACE文件:
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
name = "com_google_protobuf",
sha256 = "7892a35d979304a404400a101c46ce90e85ec9e2a766a86041bb361f626247f5",
strip_prefix = "protobuf-3.16.0",
url = "https://github.com/protocolbuffers/protobuf/archive/v3.16.0.tar.gz",
)
load("@com_google_protobuf//:protobuf_deps.bzl", "protobuf_deps")
protobuf_deps()
新建文件protoc,里面存放需要编译的proto和BUILD文件
BUILD文件为:
load("@rules_cc//cc:defs.bzl", "cc_proto_library")
load("@rules_proto//proto:defs.bzl", "proto_library")
package(default_visibility = ["//visibility:public"])
cc_proto_library(
name = "msg_proto",
deps = [
":msg_proto_lib",
],
)
proto_library(
name = "msg_proto_lib",
srcs = [
"msg.proto",
],
)
proto文件随意:文件名为:msg.proto
syntax = "proto2";
package Im;
message Content
{
required int32 id = 1;
required string str = 2;
optional int32 opt = 3;
}
在WORKSPACE同级新建文件夹src:
BUILD:
load("@rules_cc//cc:defs.bzl", "cc_proto_library")
load("@rules_proto//proto:defs.bzl", "proto_library")
cc_binary(
name = "main",
srcs = ["main.cc"],
deps = ["//protoc:msg_proto"],
)
main.cc
#include <iostream>
#include "protoc/msg.pb.h"
int main() {
Im::Content msg ;
msg.set_id(10);
msg.set_str("sshuaige"),
std::cout << msg.id() << '\n' << msg.str() << std::endl;
return 0;
}
执行命令:
bazel run //src:main
INFO: Analyzed target //src:main (1 packages loaded, 2 targets configured).
INFO: Found 1 target...
Target //src:main up-to-date:
bazel-bin/src/main
INFO: Elapsed time: 0.955s, Critical Path: 0.80s
INFO: 3 processes: 1 internal, 2 linux-sandbox.
INFO: Build completed successfully, 3 total actions
INFO: Running command line: bazel-bin/src/main
10
sshuaige