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

5
我有一个带有库和二进制文件的 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`

请参考以下链接中的编译选项部分: https://doc.rust-lang.org/cargo/commands/cargo-build.html>请检查是否有所帮助。 - TheCoolDrop
我们能否在 cargo 配置文件的 [[bin]] 块中设置 build.target?但如果使用 --target,它将被覆盖。您的配置现在是什么样子? - spazm
将二进制文件作为子包需要库?这可能可行,但似乎有些不正规。祝好运! - spazm
如果你正确地编写了代码,它只会抱怨在你的主 Rust 文件中没有邮件函数。你如何期望二进制文件在没有主函数的情况下工作呢? - nikoss
2个回答

2

我曾经遇到过完全相同的问题。官方 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};
    // ...
}

顺便说一下,关于这个问题,我已经在Rust的问题跟踪器上添加了一个问题。至少,我希望文档和编译器错误消息能够改善用于二进制条件编译。 - pemistahl
看起来这里有文档记录:https://doc.rust-lang.org/reference/conditional-compilation.html - André Staltz

-2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接