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