Rust自定义二进制项目中工具文件clap.rs移除main函数后触发error[E0601]错误的解决方案咨询
问题的根源其实很好理解:Rust的src/bin目录是用来存放独立二进制目标文件的,Cargo默认会把这个目录下的每一个.rs文件都当成单独的二进制crate编译,而每个二进制crate都必须有main()函数作为执行入口。所以你把clap.rs放在src/bin下时,Cargo会默认把它当成另一个要编译的二进制,一旦去掉main()自然就会报错。
下面给你两种实用的解决方案,按需选择:
方案一:将工具文件移到库模块(推荐)
这是最符合Rust项目规范的做法,把工具代码放到库模块中,让二进制文件依赖库的功能:
调整文件结构:
把src/bin/clap.rs移动到src/clap.rs,调整后的项目结构如下:src/ ├── bin/ │ └── cli.rs └── clap.rs配置库模块导出:
如果src目录下没有lib.rs,新建一个并添加以下内容,用来导出clap模块:pub mod clap;在cli.rs中导入函数:
在src/bin/cli.rs里,通过你的Cargo项目名称(即Cargo.toml中name字段的值)导入get_matches函数:use your_crate_name::clap::get_matches; fn main() { let matches = get_matches(); // 你的业务逻辑代码 }
方案二:通过Cargo.toml指定仅编译目标二进制
如果你不想移动文件,可以直接告诉Cargo只编译cli.rs作为二进制,忽略clap.rs的二进制编译要求:
修改Cargo.toml:
添加[[bin]]配置块,明确指定要编译的二进制文件:[[bin]] name = "cli" path = "src/bin/cli.rs"这样Cargo就只会把
src/bin/cli.rs当成二进制目标,不会把clap.rs当作独立二进制处理。在cli.rs中导入clap模块:
在src/bin/cli.rs里,直接把clap.rs作为子模块导入:mod clap; use clap::get_matches; fn main() { let matches = get_matches(); // 你的业务逻辑代码 }
两种方案都能解决问题,方案一更适合中大型项目,方便后续复用库代码;方案二适合小型项目快速调整,不需要改动文件结构。
内容的提问来源于stack exchange,提问作者Rafaelo

