从macOS到Linux的Rust跨平台编译-lpcap

3

我正在尝试使用cargo build --target=x86_64-unknown-linux-musl将我的Mac OS上的Rust项目交叉编译到Linux。

  • 我使用brew install FiloSottile/musl-cross/musl-cross在Mac上安装了适用于Linux + musl交叉编译的二进制文件,因为我希望得到一个独立的二进制文件。
  • 我还使用rustup target add x86_64-unknown-linux-gnu安装了目标文件。
  • 并且我在.cargo/config中设置了以下内容:
[target.x86_64-unknown-linux-musl]
linker = "x86_64-linux-musl-gcc"

然而,我在使用两个库sqlite3和pcap时遇到了问题:

  = note: /usr/local/Cellar/musl-cross/0.9.8/libexec/bin/../lib/gcc/x86_64-linux-musl/6.4.0/../../../../x86_64-linux-musl/bin/ld: cannot find -lsqlite3
          /usr/local/Cellar/musl-cross/0.9.8/libexec/bin/../lib/gcc/x86_64-linux-musl/6.4.0/../../../../x86_64-linux-musl/bin/ld: cannot find -lpcap
          collect2: error: ld returned 1 exit status

我通过在Cargo.toml文件中添加features = ["bundled"]来解决sqlite3链接器问题(类似于此处所述的方法- https://users.rust-lang.org/t/linker-cannot-find-lsqlite3/23230/18),这可能是从源代码构建的(很好),但当我尝试对pcap进行相同操作时,出现了以下错误:

the package `myProject` depends on `pcap`, with features: `bundled` but `pcap` does not have these features.

在某个地方读到后,我也尝试过(心存希望)使用 RUSTPATH='-L/...' cargo build ... 提供已安装的 Mac 上的 libpcap 路径, 但结果当然是未定义符号错误。

有什么方法可以解决这个问题,并在 macOS 上交叉编译我的 Rust 项目成为静态链接二进制文件以在 Linux 上运行?

1个回答

1
跨编译并不能神奇地处理库。你不能仅仅说“我想要 musl”,然后让某个东西处理所有的依赖关系。
你看到的错误信息正是在告诉你这一点:它找不到 libsqlite3libpcap
sqlite 的错误消失的原因是因为你的 sqlite 库有一个 bundled 特性,它用内置的 sqlite 客户端替换了链接。然而,这也请求了 pcap bundled 特性,但这个特性不存在。
你有两个选择:
  • 如果你不介意损失 bundled sqlite 客户端的性能,将你的特性定义更改为针对需要 sqlite 的依赖关系的特性。
  • 如果你想要原始的库本身,你就必须为 musl 编译它。
无论发生什么,您都需要使用由您的编译器提供的默认sysroot为musl交叉编译。由于每个库都不同,您需要查阅文档。完成后,您应该能够使用< -lpcap>标志,并且错误会自行解决。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接