rust 如何指定Cargo只在特定目标上构建二进制文件?

c9qzyr3d  于 2022-11-12  发布在  Go
关注(0)|答案(2)|浏览(296)

我有一个Cargo项目,它有一个库和一个二进制文件。库可以在很多平台上使用,包括Android,而二进制文件只能在Linux上使用。因此,二进制文件包含了一堆Linux特定的代码,当我以Android为目标时,这些代码无法编译。有没有办法指定(不使用特性)二进制文件只能在Linux上编译?
我试着把#![cfg(target_os = "linux")]放到我的二进制文件的main.rs中,但是我得到了这个错误:

  1. error[E0601]: `main` function not found in crate `server`
  2. --> src/bin/server/main.rs:1:1
  3. |
  4. 1 | / #![cfg(target_os = "linux")]
  5. 2 | |
  6. 3 | | use anyhow::{self, Context};
  7. 4 | |
  8. ... |
  9. 36 | | }
  10. 37 | | }
  11. | |_^ consider adding a `main` function to `src/bin/server/main.rs`
k10s72fa

k10s72fa1#

我也遇到了同样的问题。官方的 rust 文档似乎没有提到如何解决它。但我找到了一个解决方案。
诀窍是在main.rs文件中指定两个main()函数。第一个包含在Linux上要执行的代码。第二个保持为空。在条件编译的帮助下,您可以告诉编译器要编译两个main()函数中的哪一个。

  1. // within main.rs
  2. # [cfg(target_os = "linux")]
  3. fn main() {
  4. // Your Linux-specific code goes here...
  5. }
  6. # [cfg(not(target_os = "linux"))]
  7. fn main() {} // remains empty for all other OS

如果您在顶层有特定于操作系统的导入或其他代码,只需将其 Package 在模块中,并对其使用条件编译。

  1. # [cfg(target_os = "linux")]
  2. mod linux {
  3. use anyhow::{self, Context};
  4. // ...
  5. }
展开查看全部
gz5pxeao

gz5pxeao2#

以下链接提供了相关信息,可帮助您进行目标选择和选择性编译https://doc.rust-lang.org/cargo/commands/cargo-build.html#target-selection

相关问题