Linking error when building with target-feature=+crt-static
- Dominant language
- Rust
- Stars
- 286
- Forks
- 71
- PR merge metrics
- No merged PRs in 30d
Description
This feature makes Visual C++ runtime to be linked output binaries statically.
I found a workaround but maybe there is some better way?
I build on Windows with:
MS Visual Studio 2019
Vulkan SDK 1.2.162.1
rustc 1.48.0 (7eac88abb 2020-11-16)
Code (build.rs):
```rust
use anyhow::*;
use glob::glob;
use std::path::PathBuf;
struct ShaderData {
src: String,
src_path: PathBuf,
spv_path: PathBuf,
kind: shaderc::ShaderKind,
}
impl ShaderData {
pub fn load(src_path: PathBuf) -> Result {
let extension = src_path
.extension()
.context("File has no extension")?
.to_str()
.context("Extension cannot be converted to &str")?;
let kind = match extension {
"vert" => shaderc::ShaderKind::Vertex,
"frag" => shaderc::ShaderKind::Fragment,
"comp" => shaderc::ShaderKind::Compute,
_ => bail!("Unsupported shader: {}", src_path.display()),
};
let src = std::fs::read_to_string(src_path.clone())?;
let spv_path = src_path.with_extension(format!("{}.spv", extension));
Ok(Self {
src,
src_path,
spv_path,
kind,
})
}
}
fn main() -> Result<()> {
// Collect all shaders recursively within /src/
let mut shader_paths = [
glob("./src/**/*.vert")?,
glob("./src/**/*.frag")?,
glob("./src/**/*.comp")?,
];
let shaders: Result> = shader_paths
.iter_mut()
.flatten()
.map(|glob_res| -> Result { ShaderData::load(glob_res?) })
.collect();
let shaders = shaders?;
let mut compiler = shaderc::Compiler::new().context("Unable to create shader compiler")?;
for shader in shaders {
println!(
"cargo:rerun-if-changed={}",
shader
.src_path
.as_os_str()
.to_str()
.expect("Failed to get string name for shader")
);
let compiled = compiler.compile_into_spirv(
&shader.src,
shader.kind,
shader.src_path.to_str().unwrap(),
"main",
None,
)?;
std::fs::write(shader.spv_path, compiled.as_binary_u8())?;
}
Ok(())
}
```
Cargo.toml:
```
[build-dependencies]
anyhow = "1.0"
glob = "0.3"
shaderc = "0.7"
```
I run build in Powershell with commands:
```powershell
$env:RUSTFLAGS="-C target-feature=+crt-static"
cargo build
```
I expect build to compile but got this (this is only a part, a lot of omitted):
```
LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library
LINK : warning LNK4286: symbol '_invalid_parameter_noinfo_noreturn' defined in 'libucrt.lib(invalid_parameter.obj)' is imported by 'libshaderc_sys-cae357ba032ea1ca.rlib(validate_scopes.obj)'
LINK : warning LNK4217: symbol '_invalid_parameter_noinfo_noreturn' defined in 'libucrt.lib(invalid_parameter.obj)' is imported by 'libshaderc_sys-cae357ba032ea1ca.rlib(loop_dependence_helpers.obj)' in function '"protected: virtual class std::fpos __cdecl std::basic_stringbuf,class std::allocator >::seekoff(__int64,int,int)" (?seekoff@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@MEAA?AV?$fpos@U_Mbstatet@@@2@_JHH@Z)'
LINK : warning LNK4286: symbol '_invalid_parameter_noinfo_noreturn' defined in 'libucrt.lib(invalid_parameter.obj)' is imported by 'libshaderc_sys-cae357ba032ea1ca.rlib(PpTokens.obj)'
LINK : warning LNK4286: symbol '_invalid_parameter_noinfo_noreturn' defined in 'libucrt.lib(invalid_parameter.obj)' is imported by 'libshaderc_sys-cae357ba032ea1ca.rlib(basic_block.obj)'
LINK : warning LNK4286: symbol '_invalid_parameter_noinfo_noreturn' defined in 'libucrt.lib(invalid_parameter.obj)' is imported by 'libshaderc_sys-cae357ba032ea1ca.rlib(construct.obj)'
LINK : warning LNK4286: symbol '_invalid_parameter_noinfo_noreturn' defined in 'libucrt.lib(invalid_parameter.obj)' is imported by 'libshaderc_sys-cae357ba032ea1ca.rlib(instruction.obj)'
LINK : warning LNK4286: symbol '_invalid_parameter_noinfo_noreturn' defined in 'libucrt.lib(invalid_parameter.obj)' is imported by 'libshaderc_sys-cae357ba032ea1ca.rlib(loop_utils.obj)'
LINK : warning LNK4286: symbol '_invalid_parameter_noinfo_noreturn' defined in 'libucrt.lib(invalid_parameter.obj)' is imported by 'libshaderc_sys-cae357ba032ea1ca.rlib(loop_fusion.obj)'
LINK : warning LNK4286: symbol '_invalid_parameter_noinfo_noreturn' defined in 'libucrt.lib(invalid_parameter.obj)' is imported by 'libshaderc_sys-cae357ba032ea1ca.rlib(scalar_analysis_simplification.obj)'
LINK : warning LNK4286: symbol '_invalid_parameter_noinfo_noreturn' defined in 'libucrt.lib(invalid_parameter.obj)' is imported by 'libshaderc_sys-cae357ba032ea1ca.rlib(bit_vector.obj)'
LINK : warning LNK4286: symbol '_invalid_parameter_noinfo_noreturn' defined in 'libucrt.lib(invalid_parameter.obj)' is imported by 'libshaderc_sys-cae357ba032ea1ca.rlib(instrument_pass.obj)'
LINK : warning LNK4286: symbol '_invalid_parameter_noinfo_noreturn' defined in 'libucrt.lib(invalid_parameter.obj)' is imported by 'libshaderc_sys-cae357ba032ea1ca.rlib(register_pressure.obj)'
LINK : warning LNK4286: symbol '_invalid_parameter_noinfo_noreturn' defined in 'libucrt.lib(invalid_parameter.obj)' is imported by 'libshaderc_sys-cae357ba032ea1ca.rlib(scalar_analysis.obj)'
LINK : warning LNK4286: symbol '_invalid_parameter_noinfo_noreturn' defined in 'libucrt.lib(invalid_parameter.obj)' is imported by 'libshaderc_sys-cae357ba032ea1ca.rlib(loop_dependence.obj)'
LINK : warning LNK4286: symbol '_invalid_parameter_noinfo_noreturn' defined in 'libucrt.lib(invalid_parameter.obj)' is imported by 'libshaderc_sys-cae357ba032ea1ca.rlib(dominator_analysis.obj)'
LINK : warning LNK4217: symbol '_invalid_parameter_noinfo_noreturn' defined in 'libucrt.lib(invalid_parameter.obj)' is imported by 'libshaderc_sys-cae357ba032ea1ca.rlib(struct_cfg_analysis.obj)' in function '"private: void __cdecl spvtools::opt::StructuredCFGAnalysis::AddBlocksInFunction(class spvtools::opt::Function *)" (?AddBlocksInFunction@StructuredCFGAnalysis@opt@spvtools@@AEAAXPEAVFunction@23@@Z)'
LINK : warning LNK4286: symbol '_invalid_parameter_noinfo_noreturn' defined in 'libucrt.lib(invalid_parameter.obj)' is imported by 'libshaderc_sys-cae357ba032ea1ca.rlib(value_number_table.obj)'
LINK : warning LNK4286: symbol '_invalid_parameter_noinfo_noreturn' defined in 'libucrt.lib(invalid_parameter.obj)' is imported by 'libshaderc_sys-cae357ba032ea1ca.rlib(inline_pass.obj)'
LINK : warning LNK4286: symbol '_invalid_parameter_noinfo_noreturn' defined in 'libucrt.lib(invalid_parameter.obj)' is imported by 'libshaderc_sys-cae357ba032ea1ca.rlib(folding_rules.obj)'
LINK : warning LNK4217: symbol '_invalid_parameter_noinfo_noreturn' defined in 'libucrt.lib(invalid_parameter.obj)' is imported by 'libshaderc_sys-cae357ba032ea1ca.rlib(fold.obj)' in function '"public: class std::_Tree_iterator > > > __cdecl std::_Tree,class std::allocator >,1> >::erase(class std::_Tree_const_iterator > > >,class std::_Tree_const_iterator > > >)" (?erase@?$_Tree@V?$_Tmap_traits@PEBVConstant@analysis@opt@spvtools@@IU?$less@PEBVConstant@analysis@opt@spvtools@@@std@@V?$allocator@U?$pair@QEBVConstant@analysis@opt@spvtools@@I@std@@@6@$00@std@@@std@@QEAA?AV?$_Tree_iterator@V?$_Tree_val@U?$_Tree_simple_types@U?$pair@QEBVConstant@analysis@opt@spvtools@@I@std@@@std@@@std@@@2@V?$_Tree_const_iterator@V?$_Tree_val@U?$_Tree_simple_types@U?$pair@QEBVConstant@analysis@opt@spvtools@@I@std@@@std@@@std@@@2@0@Z)'
LINK : warning LNK4217: symbol '_invalid_parameter_noinfo_noreturn' defined in 'libucrt.lib(invalid_parameter.obj)' is imported by 'libshaderc_sys-cae357ba032ea1ca.rlib(block_merge_util.obj)' in function '"bool __cdecl spvtools::opt::blockmergeutil::CanMergeWithSuccessor(class spvtools::opt::IRContext *,class spvtools::opt::BasicBlock *)" (?CanMergeWithSuccessor@blockmergeutil@opt@spvtools@@YA_NPEAVIRContext@23@PEAVBasicBlock@23@@Z)'
LINK : warning LNK4286: symbol '_invalid_parameter_noinfo_noreturn' defined in 'libucrt.lib(invalid_parameter.obj)' is imported by 'libshaderc_sys-cae357ba032ea1ca.rlib(propagator.obj)'
LINK : warning LNK4286: symbol '_invalid_parameter_noinfo_noreturn' defined in 'libucrt.lib(invalid_parameter.obj)' is imported by 'libshaderc_sys-cae357ba032ea1ca.rlib(decoration_manager.obj)'
LINK : warning LNK4286: symbol '_invalid_parameter_noinfo_noreturn' defined in 'libucrt.lib(invalid_parameter.obj)' is imported by 'libshaderc_sys-cae357ba032ea1ca.rlib(debug_info_manager.obj)'
LINK : warning LNK4286: symbol '_invalid_parameter_noinfo_noreturn' defined in 'libucrt.lib(invalid_parameter.obj)' is imported by 'libshaderc_sys-cae357ba032ea1ca.rlib(eliminate_dead_functions_util.obj)'
LINK : warning LNK4286: symbol '_invalid_parameter_noinfo_noreturn' defined in 'libucrt.lib(invalid_parameter.obj)' is imported by 'libshaderc_sys-cae357ba032ea1ca.rlib(const_folding_rules.obj)'
LINK : warning LNK4286: symbol '_invalid_parameter_noinfo_noreturn' defined in 'libucrt.lib(invalid_parameter.obj)' is imported by 'libshaderc_sys-cae357ba032ea1ca.rlib(ir_context.obj)'
LINK : warning LNK4286: symbol '_invalid_parameter_noinfo_noreturn' defined in 'libucrt.lib(invalid_parameter.obj)' is imported by 'libshaderc_sys-cae357ba032ea1ca.rlib(type_manager.obj)'
LINK : warning LNK4217: symbol '_invalid_parameter_noinfo_noreturn' defined in 'libucrt.lib(invalid_parameter.obj)' is imported by 'libshaderc_sys-cae357ba032ea1ca.rlib(ir_loader.obj)' in function '"protected: void __cdecl std::vector >,class std::allocator > > >::_Reallocate(unsigned __int64)" (?_Reallocate@?$vector@V?$unique_ptr@VBasicBlock@opt@spvtools@@U?$default_delete@VBasicBlock@opt@spvtools@@@std@@@std@@V?$allocator@V?$unique_ptr@VBasicBlock@opt@spvtools@@U?$default_delete@VBasicBlock@opt@spvtools@@@std@@@std@@@2@@std@@IEAAX_K@Z)'
```
I currently use a hack with specifying target explicitely. It makes cargo send custom compiler flags only to the final binary compilations and ignore build scripts:
```
cargo run --target x86_64-pc-windows-msvc
```
Contributor guide
Research direction
Start with the build.rs and Cargo.toml example, then reproduce the Windows MSVC build using RUSTFLAGS="-C target-feature=+crt-static" and cargo build. Inspect how the shaderc build dependency is linked when the static CRT is enabled. Done means the build succeeds without requiring an explicit target workaround.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- cpp, rust
- Domain
- build-system, compilers
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100