Rust交叉编译-lpcap从macos到linux

问题描述 投票:3回答:1

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

但是,我遇到了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文件(类似于此处描述的内容-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上运行?

linux rust cross-compiling libpcap musl
1个回答
0
投票

交叉编译无法神奇地处理库。您不能只说“我想要musl”并让something照顾所有依赖项。

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

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

您有两个选择:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.