Rust从macOS交叉编译-lpcap到Linux

时间:2019-09-28 21:36:49

标签: linux rust cross-compiling libpcap musl

我正在尝试使用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

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

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

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

有什么主意如何解决这个问题,并将我的Rust项目交叉编译为macOS上的静态链接二进制文件,以便在Linux上运行?

1 个答案:

答案 0 :(得分:0)

交叉编译不能神奇地处理库。您不能只说“我要musl”并让某事处理所有依赖项。

您看到的错误消息正好告诉您:找不到libsqlite3libpcap

sqlite错误消失的原因是您的sqlite库具有bundled功能,该功能用内置的sqlite客户端代替了链接。但是,这也要求使用pcap bundled功能,该功能不存在。

您有两个选择:

  • 如果您不介意捆绑的sqlite客户端中的性能下降,请更改功能定义以定位需要sqlite的依赖项的功能
  • 如果您想要原始库本身,则必须为musl编译它

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