我正在编写一个带有一些C集成的Rust程序,所以我使用的是自定义构建脚本。在这个脚本中,我将-L <path to library>
传递给rustc
,但这只有在<path to library>
不包含空格时才有效。 build.rs
中的确切行:
println!(r"cargo:rustc-flags= -L {}/target/sdsl/sdsl_install/lib -l sdsl -l divsufsort -l divsufsort64 -l stdc++", current_dir);
如果current_dir
包含空格,我会收到此错误
error: Only `-l` and `-L` flags are allowed in build script of `top_tree_compression v0.1.0 (file:///home/jan/Uni/Bachelorarbeit/Programme/Top_Tree%20Compression)`: `-L /home/jan/Uni/Bachelorarbeit/Programme/Top_Tree Compression/target/sdsl/sdsl_install/lib -l sdsl -l divsufsort -l divsufsort64 -l stdc++`
我试图在空间之前写一个\
来逃避它,但它给了我同样的错误。然后我尝试用%20
替换空间,因为在错误消息中空格被替换为此,但后来我得到链接错误,因为路径不正确。
看起来你不能像Rust 1.29那样。 source code for the current master of Cargo:
let mut flags_iter = value .split(|c: char| c.is_whitespace()) .filter(|w| w.chars().any(|c| !c.is_whitespace()));
这天真地在任何空格上分割参数,无论它出现在何处。这似乎是货物的一个错误或限制,你应该寻找一个已经提交的问题或自己提交一个文件。
话虽如此,如果您使用更适合用途的rustc-link-lib
和rustc-link-search
参数,空间可以正常工作:
println!(r#"cargo:rustc-link-search={}/target/sdsl/sdsl_install/lib"#, "some thing");
$ cargo run --verbose
Compiling xx v0.1.0 (file:///private/tmp/xx)
[...snip...]
Running `rustc [...snip...] -L 'some thing/target/sdsl/sdsl_install/lib'`