我正在尝试使用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上运行?
交叉编译无法神奇地处理库。您不能只说“我想要musl
”并让something照顾所有依赖项。
您看到的错误消息正好告诉您:它找不到libsqlite3
和libpcap
。
sqlite错误消失的原因是,您的sqlite库具有bundled
功能,该功能用内置的sqlite客户端替换了链接。但是,这也要求不存在的pcap
bundled
功能。
您有两个选择:
musl
无论发生什么情况,您都需要使用libpcap
编译器提供的默认sysroot交叉编译musl的musl
。由于每个库的不同,您将需要查阅libpcap文档。一旦这样做,您应该可以使用-lpcap
标志,并且错误会自行解决。