首页 > 解决方案 > Rust 交叉编译 -lpcap 从 macos 到 linux

问题描述

我正在尝试使用cargo build --target=x86_64-unknown-linux-musl.

[target.x86_64-unknown-linux-musl]
linker = "x86_64-linux-musl-gcc"

但是,我遇到了 2 个库的问题 - 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

我能够通过添加features = ["bundled"]到我的Cargo.toml文件来解决 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.

在某处阅读后,我还尝试(希望不高)在 mac 上使用提供已安装 libpcap 的路径,RUSTPATH='-L/...' cargo build ...但这当然会导致未定义的符号错误。

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

标签: linuxrustcross-compilinglibpcapmusl

解决方案


交叉编译不会神奇地处理库。你不能只说“我想要musl”并让一些东西照顾你所有的依赖。

您看到的错误消息正是在告诉您:它找不到libsqlite3libpcap.

sqlite 的错误消失的原因是因为您的 sqlite 库有一个bundled功能,它用内置的 sqlite 客户端替换链接。但是,这也请求了pcap bundled不存在的功能。

你有两个选择:

  • 如果您不介意捆绑的 sqlite 客户端中的性能损失,请更改您的功能定义以针对需要 sqlite 的依赖项的功能
  • 如果您想要原始库本身,则必须对其进行编译musl

无论发生什么情况,您都需要使用编译器libpcap提供的默认 sysroot交叉编译 musl musl。由于这因库而异,因此您需要查阅 libpcap 文档。完成此操作后,您应该可以使用该-lpcap标志,并且错误将自行解决。


推荐阅读