如何指定Cargo应仅在特定目标上构建二进制文件



我用一个库和一个二进制文件建立了一个Cargo项目。该库旨在用于包括Android在内的许多平台,而二进制文件仅用于Linux。因此,二进制文件包含一堆特定于Linux的代码,当我以Android为目标时,这些代码不会编译。有没有一种方法可以指定(不使用功能(二进制文件只能在Linux上编译?

我试着把#![cfg(target_os = "linux")]放在二进制文件的main.rs中,但后来我得到了这个错误:

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

我遇到了完全相同的问题。Rust的官方文档似乎没有提到如何解决这个问题。但我找到了一个解决方案。

诀窍是在文件main.rs中指定两个main()函数。第一个包含在Linux上要执行的代码。第二个仍然是空的。在条件编译的帮助下,您可以告诉编译器要编译两个main()函数中的哪一个。

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

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

#[cfg(target_os = "linux")]
mod linux {
use anyhow::{self, Context};
// ...
}

下面的链接提供了相关信息,这些信息将在目标选择和选择性编译方面对您有所帮助https://doc.rust-lang.org/cargo/commands/cargo-build.html#target-选择

相关内容

  • 没有找到相关文章

最新更新