2

我正在尝试在 32 位 mips cpu 上使用 gopacket 库将一个小应用程序编译到 linux 上。不幸的是,我收到了很多这样的错误:

/home/cdutz/go/pkg/mod/github.com/google/gopacket@v1.1.19/pcap/pcap.go:30:22: undefined: pcapErrorNotActivated

在“普通”Linux 系统上,这些似乎是在“pcap_unix.go”中定义的,而在 Windows 上,这些值来自“defs_windows_amd64.go”。我的目标系统上确实有 32 位 mips 版本的 libpcap,这很好,因为我的目标系统没有额外的空间来安装编译任何东西所需的所有工具。我知道 libpcap 在 Windows 上不作为 1 对 1 版本存在,所以这可能解释了“defs”文件。但我通常希望它具有与我的 linux 系统上的 API 相同的 API。

[更新] 所以似乎需要确保的第一件事是执行 cgo。这是通过设置环境变量来完成的:

CGO_ENABLED=1

接下来,我们需要确保安装了与 mips 兼容的 libpcap 版本(头文件在任何架构上都是相同的)。为了在我的 Ubuntu 16.4 上执行此操作,我首先需要启用“mips”架构:

dpkg --add-architecture mips

并将 debian repo 添加到 /etc/apt/sources.list

deb [trusted=yes] http://ftp.de.debian.org/debian buster main

完成后,我可以安装 mips 二进制文件:

apt install libpcap-dev:mips libpcap0.8-dev:mips libc6-dev:mips libdbus-1-dev:mips libpcap0.8:mips

为了交叉编译,似乎我需要一个可以做到这一点的 gccgo 版本。为此,我安装了:

apt-get install gccgo-mips-linux-gnu

现在出现了一些我不确定我做对了的事情,但是当使用 compiler=gccgo 运行 go build 时,它总是选择 amd64 版本并且使用除 'gccgo' 之外的其他任何东西作为编译器参数都不起作用,所以我更新了 / 中的符号链接usr/bin/gccgo 指向:'mips-linux-gnu-gccgo-8'(在同一目录中)。

在所有这些更改之后,我几乎可以使用以下命令构建所有内容:

go build -compiler=gccgo

如果我使用“-x”选项启用附加输出,我可以看到 cgo 现在正在做这件事。它还在编译所有其他模块。但是在 pcap 上它现在失败了:

cc1: error: command line option '-c' is valid for the driver but not for C

所以这就是我目前所困的地方。

4

1 回答 1

1

好的,3天后,我想我设法让事情正常进行,我会总结一下我所做的。

最后 gccgo 路径是死胡同,所以gccgo-mips-linux-gnu我没有安装,而是安装了gcc-mips-linux-gnu.

接下来我设置CC环境变量指向这个:

 export CC=/usr/bin/mips-linux-gnu-gcc-8

这实际上是缺少的。

所以总结一下我的 Ubuntu 16.04 系统:

dpkg --add-architecture mips
echo "deb [trusted=yes] http://ftp.de.debian.org/debian buster main" > /etc/apt/sources.list
apt update
apt install -y wget git build-essential mc
apt install -y gcc-mips-linux-gnu
apt install -y libpcap-dev:mips libpcap0.8-dev:mips libc6-dev:mips libdbus-1-dev:mips libpcap0.8:mips

export CC=/usr/bin/mips-linux-gnu-gcc-8
export GOOS=linux
export GOARCH=mips   
export GOMIPS=softfloat
export CGO_ENABLED=1

go build

我希望这可能对其他人有所帮助。

于 2021-03-11T16:39:45.917 回答