linux - Rust 交叉编译 -lpcap 从 macos 到 linux
问题描述
我正在尝试使用cargo build --target=x86_64-unknown-linux-musl
.
- 我在 mac 上安装了用于 Linux + musl 交叉编译的二进制文件,
brew install FiloSottile/musl-cross/musl-cross
因为理想情况下我想要一个独立的二进制文件。 - 我还使用安装了目标
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
文件来解决 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 上运行?
解决方案
交叉编译不会神奇地处理库。你不能只说“我想要musl
”并让一些东西照顾你所有的依赖。
您看到的错误消息正是在告诉您:它找不到libsqlite3
和libpcap
.
sqlite 的错误消失的原因是因为您的 sqlite 库有一个bundled
功能,它用内置的 sqlite 客户端替换链接。但是,这也请求了pcap
bundled
不存在的功能。
你有两个选择:
- 如果您不介意捆绑的 sqlite 客户端中的性能损失,请更改您的功能定义以针对需要 sqlite 的依赖项的功能
- 如果您想要原始库本身,则必须对其进行编译
musl
无论发生什么情况,您都需要使用编译器libpcap
提供的默认 sysroot交叉编译 musl musl
。由于这因库而异,因此您需要查阅 libpcap 文档。完成此操作后,您应该可以使用该-lpcap
标志,并且错误将自行解决。
推荐阅读
- node.js - 让未解析的异步函数在 nodejs 服务器上执行
- c++ - c++程序打印出地址而不是值
- youtube - Silverstripe 3:覆盖 TinyMCE 样式
- python - 没有循环的迭代二项式更新
- mysql - 访问数据 MySQL。冻结构建
- python - python中键盘模块的奇怪错误
- r - OpenMP、随机变量和再现性
- python - scikit 中 log_loss 的行为与 numpy 数组相比
- ssl - 通配符 SaaS 平台域,通过 HTTPS,在 Kubernetes 上
- java - 从一个方法调用时,Android AlertDialog 不会显示,但它会从同一活动中的另一个方法显示。为什么?