我有一个货物工作区项目,我在 Windows 笔记本电脑上构建并运行该项目。该程序托管一个后端服务器。现在,我想将其托管在 AWS EC2 实例(Linux 机器)上。我想我要做的是首先为 Linux 构建 Cargo,然后简单地将 .exe 放入 ec2 实例并从那里运行它。
我尝试了两件事(在我的 Windows 机器上):
我)
cargo build --target=x86_64-unknown-linux-gnu
- 这给了我一些非常奇怪的编译错误,比如
error[E0412]: cannot find type `Result` in this scope; error: could not compile `once_cell` due to 223 previous errors
ii) 尝试另一个目标:
cargo build --target=aarch64-unknown-linux-gnu
得到了几乎相同的东西。
这是once_cell的一些限制吗?或者,更有可能的是,我在这里遗漏了一些基本的东西?
您收到的错误表明找不到标准库。从 Windows 交叉编译到 Linux 时,最好使用
*-musl
目标,以避免必须提供 *-gnu
目标所需的 Linux 特定库。要修复错误,只需运行以下命令:
rustup target add x86_64-unknown-linux-musl
这将安装相关的stdlib。您必须对您打算交叉编译的每个工具链执行此操作(如果您想同时使用稳定版和夜间版或其他工具链)。
如果此时您
cargo build
,您应该得到链接器错误,而不是一堆编译器错误。要解决此问题,请将以下行添加到您的 .cargo/config.toml
文件中:
[target.x86_64-unknown-linux-musl]
linker = "rust-lld"
这应该足以构建东西,尽管有些板条箱可能有平台/工具链要求,可能需要更多努力才能满足。
当然,这是假设亚马逊的 ec2 实例实际上是 x86_64 机器,但它们可能不是。类似的步骤应该适用于其他平台,只需使用所需的目标即可。例如,要构建 64 位 Arm 平台,您只需使用相同的步骤,但目标为
aarch64-unknown-linux-musl
,我使用这些步骤和 armv7-unknown-linux-musleabihf
来为我的树莓派构建内容。