cc-rs icon indicating copy to clipboard operation
cc-rs copied to clipboard

Building/linking on MSVC fails with LNK1107?

Open nabijaczleweli opened this issue 3 months ago • 10 comments

Downstream bug: https://github.com/nabijaczleweli/vswhom-sys.rs/issues/3

When building vswhom-sys.rs, @solomoncyj got this:

   Compiling shlex v1.3.0
   Compiling find-msvc-tools v0.1.2
   Compiling libc v0.2.175
   Compiling cc v1.2.38
   Compiling vswhom-sys v0.1.3 (C:\Users\solom\Downloads\vswhom-sys.rs)
error: failed to run custom build command for `vswhom-sys v0.1.3 (C:\Users\solom\Downloads\vswhom-sys.rs)`

Caused by:
  process didn't exit successfully: `C:\Users\solom\target\debug\build\vswhom-sys-046bce82504c0475\build-script-build` (exit code: 1)
  --- stdout
  cargo:rerun-if-changed=build.rs
  cargo:rerun-if-changed=ext/vswhom.cpp
  OPT_LEVEL = Some(0)
  OUT_DIR = Some(C:\Users\solom\target\debug\build\vswhom-sys-7a4b6afb6681f858\out)
  TARGET = Some(x86_64-pc-windows-msvc)
  cargo:rerun-if-env-changed=VCINSTALLDIR
  VCINSTALLDIR = None
  cargo:rerun-if-env-changed=VSTEL_MSBuildProjectFullPath
  VSTEL_MSBuildProjectFullPath = None
  cargo:rerun-if-env-changed=VSCMD_ARG_VCVARS_SPECTRE
  VSCMD_ARG_VCVARS_SPECTRE = None
  cargo:rerun-if-env-changed=WindowsSdkDir
  WindowsSdkDir = None
  cargo:rerun-if-env-changed=WindowsSDKVersion
  WindowsSDKVersion = None
  cargo:rerun-if-env-changed=LIB
  LIB = None
  PATH = Some(C:\Users\solom\target\debug\deps;C:\Users\solom\target\debug;C:\Users\solom\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\x86_64-pc-windows-msvc\lib;C:\Program Files (x86)\oh-my-posh\bin\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\ProgramData\chocolatey\bin;C:\clang\bin;C:\Program Files\NASM;C:\bin;C:\lib;C:\Program Files\dotnet\;C:\Program Files\NVIDIA Corporation\NVIDIA app\NvDLISR;C:\Program Files\GitHub CLI\;C:\Program Files\CMake\bin;C:\Program Files\Git\cmd;C:\Program Files (x86)\Gpg4win\..\GnuPG\bin;C:\Program Files\Monero GUI Wallet\;C:\Program Files (x86)\Windows Kits\10\Windows Performance Toolkit\;C:\Program Files\nodejs\;C:\LLVM\bin;C:\Program Files\Go\bin;C:\Program Files\PowerShell\7\;C:\c\bin;C:\perl\site\bin;C:\perl\bin;C:\Users\solom\AppData\Local\Programs\oh-my-posh\bin\;C:\Users\solom\AppData\Local\Programs\Python\Python310\Scripts\;C:\Users\solom\AppData\Local\Programs\Python\Python310\;C:\Users\solom\AppData\Local\Programs\Python\Launcher\;C:\Users\solom\.cargo\bin;C:\Users\solom\AppData\Local\Microsoft\WindowsApps;C:\Users\solom\AppData\Local\Microsoft\WinGet\Links;C:\Users\solom\AppData\Local\Programs\Python\Python313\Scripts;C:\Users\solom\AppData\Local\Programs\Microsoft VS Code\bin;C:\Users\solom\AppData\Local\JetBrains\Toolbox\scripts;C:\Users\solom\.dotnet\tools;C:\Users\solom\AppData\Local\gitkraken\bin;C:\Users\solom\.dotnet\tools;C:\Users\solom\AppData\Local\Microsoft\WindowsApps;C:\Users\solom\AppData\Local\Programs\cursor\resources\app\bin;C:\Users\solom\AppData\Local\Muse Hub\lib;C:\Users\solom\AppData\Roaming\npm;C:\Users\solom\go\bin)
  cargo:rerun-if-env-changed=INCLUDE
  INCLUDE = None
  HOST = Some(x86_64-pc-windows-msvc)
  cargo:rerun-if-env-changed=CXX_x86_64-pc-windows-msvc
  CXX_x86_64-pc-windows-msvc = None
  cargo:rerun-if-env-changed=CXX_x86_64_pc_windows_msvc
  CXX_x86_64_pc_windows_msvc = None
  cargo:rerun-if-env-changed=HOST_CXX
  HOST_CXX = None
  cargo:rerun-if-env-changed=CXX
  CXX = Some(clang++)
  cargo:rerun-if-env-changed=CC_KNOWN_WRAPPER_CUSTOM
  CC_KNOWN_WRAPPER_CUSTOM = None
  RUSTC_WRAPPER = None
  cargo:rerun-if-env-changed=CC_ENABLE_DEBUG_OUTPUT
  cargo:rerun-if-env-changed=CRATE_CC_NO_DEFAULTS
  CRATE_CC_NO_DEFAULTS = None
  DEBUG = Some(true)
  cargo:rerun-if-env-changed=CXXFLAGS
  CXXFLAGS = Some(-march=native -flto=thin)
  cargo:rerun-if-env-changed=CC_SHELL_ESCAPED_FLAGS
  CC_SHELL_ESCAPED_FLAGS = None
  cargo:rerun-if-env-changed=HOST_CXXFLAGS
  HOST_CXXFLAGS = None
  cargo:rerun-if-env-changed=CXXFLAGS_x86_64_pc_windows_msvc
  CXXFLAGS_x86_64_pc_windows_msvc = None
  cargo:rerun-if-env-changed=CXXFLAGS_x86_64-pc-windows-msvc
  CXXFLAGS_x86_64-pc-windows-msvc = None
  CARGO_ENCODED_RUSTFLAGS = Some(-Ctarget-cpu=native)
  cargo:rerun-if-env-changed=AR_x86_64-pc-windows-msvc
  AR_x86_64-pc-windows-msvc = None
  cargo:rerun-if-env-changed=AR_x86_64_pc_windows_msvc
  AR_x86_64_pc_windows_msvc = None
  cargo:rerun-if-env-changed=HOST_AR
  HOST_AR = None
  cargo:rerun-if-env-changed=AR
  AR = None
  cargo:rerun-if-env-changed=ARFLAGS
  ARFLAGS = None
  cargo:rerun-if-env-changed=HOST_ARFLAGS
  HOST_ARFLAGS = None
  cargo:rerun-if-env-changed=ARFLAGS_x86_64_pc_windows_msvc
  ARFLAGS_x86_64_pc_windows_msvc = None
  cargo:rerun-if-env-changed=ARFLAGS_x86_64-pc-windows-msvc
  ARFLAGS_x86_64-pc-windows-msvc = None
  C:\Users\solom\target\debug\build\vswhom-sys-7a4b6afb6681f858\out\71b29add3157f200-vswhom.o : fatal error LNK1107: invalid or corrupt file: cannot read at 0x1B124

  --- stderr


  error occurred in cc-rs: command did not execute successfully (status code exit code: 1107): "C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.44.35207\\bin\\HostX64\\x64\\lib.exe" "-out:C:\\Users\\solom\\target\\debug\\build\\vswhom-sys-7a4b6afb6681f858\\out\\libvswhom.a" "-nologo" "C:\\Users\\solom\\target\\debug\\build\\vswhom-sys-7a4b6afb6681f858\\out\\71b29add3157f200-vswhom.o"

LNK1107 is nominally corruption, but this persists through a de-novo rebuild.

build.rs says:

    let mut cc = cc::Build::new();
    cc.cpp(true);
    cc.file("ext/vswhom.cpp");
    if cc.get_compiler().is_like_msvc() {
        cc.flag("/Zm2000");
    }
    cc.compile("vswhom");

with nothing of interest otherwise, so this looks like an issue with the reporter's setup or with the way cc drives it to me.

nabijaczleweli avatar Sep 22 '25 11:09 nabijaczleweli

The code looks ok, would need more info on the environment to know what's going on.

NobodyXu avatar Sep 22 '25 12:09 NobodyXu

i think is that cc failed to get the linker env, and called msvc linker over the clang one if clang was used to compile the code

solomoncyj avatar Sep 22 '25 12:09 solomoncyj

Well you are building for MSVC, so if it was built with clang then we've found the issue at hand.

...and looking at the environment dump I do see CXX=clang++ and CXXFLAGS in cc style; it's unclear what this should mean when building for a -msvc quad (beside maybe it should explode with "compiler and linker are different brands" like cmake does).

nabijaczleweli avatar Sep 22 '25 12:09 nabijaczleweli

i have flags to rust that overids the liker to lld-link, and I have enviroment variables pointing to lld-link as the linker.. so maybe the buildscript ovrode the linker, but not the compier

solomoncyj avatar Sep 22 '25 12:09 solomoncyj

cc doesn't link anything by default though, only compiles an object and archive it

NobodyXu avatar Sep 22 '25 14:09 NobodyXu

Hmmm, let me set up ar variables and see if it fixes it

solomoncyj avatar Sep 22 '25 15:09 solomoncyj

ok, exporting AR = llvm-ar fixed it, i think therre should be a toolchain checker to make sure all of them is compatible before compiling, like cmake

solomoncyj avatar Sep 22 '25 23:09 solomoncyj

Hmmm normally clang does work with ar

Could this be under influence of -flto (we were talking about only enable -flto for -Clinker-plugin-lto)

NobodyXu avatar Sep 23 '25 13:09 NobodyXu

Cold be a possibility as clang's flto emits llvm IR insted of objects, as lld can optimize it better, but runs the risk of non toolchain not being able to use it

solomoncyj avatar Sep 23 '25 13:09 solomoncyj

Yes, that's what I'm working on at the moment in #1564

NobodyXu avatar Sep 23 '25 15:09 NobodyXu