gpt4 book ai didi

go - 安装 gccgo 和 Go 一起测试 Protocol Buffers 3

转载 作者:行者123 更新时间:2023-12-01 19:25:21 29 4
gpt4 key购买 nike

我正在尝试安装 gccgo用 Golang 测试 Protocol Buffers 3...我不得不承认,我在 8 年后又回到了开发者(而且我不是母语人士)所以,谢谢你的放纵。谢谢 :)

所以,经过几次阅读,我决定从这个 repo 的 README 开始:https://github.com/golang/protobuf

第一个要点:检查!

我的 Mac 上安装了 Protocol Buffer 的最后一个版本(protobuf-cpp-3.11.4.tar.gz据我了解)https://github.com/protocolbuffers/protobuf/releases/tag/v3.11.4

$ ls $GOBIN
dlv* gocode* godef* gopkgs* protoc-gen-go*
go-outline* gocode-gomod* golint* goreturns*

第二个要点:在这里我花了几个小时......没有成功:/

Of course, install the Go compiler and tools from https://golang.org/ See https://golang.org/doc/install for details or, if you are using gccgo, follow the instructions at https://golang.org/doc/install/gccgo



我的理解是需要安装 gccgo这是 gcc 编译器的一个分支。然后我读到了 gccgo实际上只是 gcc 编译器的自定义版本,配置了 --enable-languages=c,c++,go选项( src https://golang.org/doc/install/gccgo )...那么为什么在 repos 上有一个特殊的分支,它在哪里? ( https://gcc.gnu.org/git.html ) 我

我只是放弃尝试从 git 仓库下载 gccgo 分支并找到一个 svn repo:
$ svn checkout svn://gcc.gnu.org/svn/gcc/branches/gccgo gccgo`
gccgo$ ./configure --enable-languages=c,c++,go
...
configure: error: Building GCC requires GMP 4.2+, MPFR 3.1.0+ and MPC 0.8.0+.
Try the --with-gmp, --with-mpfr and/or --with-mpc options to specify
their locations. Source code for these libraries can be found at
their respective hosting sites as well as at
<https://gcc.gnu.org/pub/gcc/infrastructure/>. See also
<http://gcc.gnu.org/install/prerequisites.html> for additional info. If
you obtained GMP, MPFR and/or MPC from a vendor distribution package,
make sure that you have installed both the libraries and the header
files. They may be located in separate packages.

所以,我下载了 gmp-6.2.0.tar.lz来自 https://gmplib.org/这导致我安装 lzip在解压缩文件之前
$ brew install lzip
$ lunzip gmp-6.2.0.tar.lz
$ tar - xvzf gmp-6.2.0.tar
$ cd gmp-6.2.0
gmp-6.2.0$ ./configure
gmp-6.2.0$ make
gmp-6.2.0$ make install
gmp-6.2.0$ make check ( a few warnings but every test have been passed successfully )

然后,安装 mpfr-3.1.6.tar.gz
$ tar -xvzf mpfr-3.1.6.tar.gz
$ cd mpfr-3.1.6
mpfr-3.1.6$ ./configure
mpfr-3.1.6$ ./make
mpfr-3.1.6$ ./make install

... 然后再试一次
gccgo$ ./configure --enable-languages=c,c++,go
...
The following requested languages could not be built: go
Supported languages are: c,brig,c,c++,d,fortran,lto,objc,obj-c++

最后

我不确定他们在最后一步中谈论的目录......

Build the Go samples in this directory with "make go". This creates the following executable files in the current directory: add_person_go list_people_go


makegcc 合作to 引入了一个单独的“规则”文件,它描述了如何从源代码到完成的程序,解释这个文件,找出需要编译的内容,然后调用 gcc . (来源 https://stackoverflow.com/a/768379/1216281)。所以,如果 gcc 没有正确编译,它就不能工作。
protocolbuffer$ ls
add_person.go add_person_test.go addressbook.proto list_people_test.go
add_person.go.txt addressbook.pb.go list_people.go
protocolbuffer$ make go
make: *** No rule to make target `go'. Stop.

额外的技术。如果需要信息:
~$ echo $GOPATH
/Users/me/Dev/Go/golib:/Users/me/Dev/Go/code
$GOBIN is /Users/me/Dev/Go/golib/bin
$ echo $GOBIN
/Users/me/Dev/Go/golib/bin

最佳答案

为了在 go 中编译 protobuf,你需要有 go compiler和以下包

go get github.com/golang/protobuf
go get github.com/golang/protobuf/proto

如果您的 GOPATH 包含在您的 PATH 环境中,您应该能够执行 protoc来自终端的二进制文件。

让我们尝试一个简单的例子。你定义一个 protobuf首先是模式,它代表一些对象。它看起来像
syntax="proto3";

package main;

message Person {
string name = 1;
int32 age = 2;
}

person.proto



下一步是将其编译成 Go 源代码,使用 protoc
protoc --go_out=. *.proto

它将生成一个 go 源代码文件,代表您的 proto message输入文件 person.pb.go .

让我们看看如何在我们的 main.go 中使用它。
package main

import (
"fmt"
"os"

"github.com/golang/protobuf/proto"
)

func main() {

p := &Person{
Name: "John Doe",
Age: 30,
}

data, err := proto.Marshal(p)
if err != nil {
fmt.Printf("marshaling error: %v", err)
os.Exit(1)
}

fmt.Printf("our raw protobuf object looks like: %+v\nits type is %T\n", data, data)

// let's unmarshal it (from byte array) to an object we can use as Person
newP := &Person{}
err = proto.Unmarshal(data, newP)
if err != nil {
fmt.Printf("unmarshaling error: %v", err)
os.Exit(1)
}

// now we can use our unmarshaled data as a struct
fmt.Printf("newP name: %v\nnewP age: %v\nnewP type: %T\n", newP.GetName(), newP.GetAge(), newP)

}

让我们运行它
→ go run .
our raw protobuf object looks like: [10 8 74 111 104 110 32 68 111 101 16 30]
its type is []uint8
newP name: John Doe
newP age: 30
newP type: *main.Person

您可以在 person.pb.go 中查看自动生成的源代码。
希望这可以帮助。

关于go - 安装 gccgo 和 Go 一起测试 Protocol Buffers 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60858245/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com