rust-lang / rust-lang/rust

Binding c++ with cxx, an error occurs on windows-gnu

Open
#137,301 5 comments 1 reaction 0 assignees View on GitHub

Nobody has claimed this yet.

A-linkage C-bug I-ICE T-compiler
Dominant language
Rust
Stars
119k
Forks
16.1k
PR merge metrics
PR metrics pending

Description

I upgraded to OCCT 7.9.0 and used cxx-rs to bind the C++ compiled dynamic library. There was no problem with the MSVC version, but the following error occurred with the GNU

Code
// build.rs
fn main() -> std::io::Result<()> {
    let out_env = std::env::var("OUT_DIR").unwrap();
    let out_dir = Path::new(&out_env)
        .parent()
        .unwrap()
        .parent()
        .unwrap()
        .parent()
        .unwrap();

    let (bin, include, lib) = get_occ_dir();

    println!("cargo:rustc-link-search=native={}", lib.display());

    for entry in std::fs::read_dir(lib)? {
        let file = entry?.path();
        if file.is_file() {
            let stem = file.file_stem().unwrap().to_str().unwrap();
            let module = if target_triple::HOST.contains("msvc") {
                stem
            } else {
                stem.strip_prefix("lib").unwrap()
            };
            println!("cargo:rustc-link-lib=static={}", module);
        }
    }

    let mut build = cxx_build::bridge("src/lib.rs");

    if target_triple::TARGET.contains("windows-gnu") {
        build.define("OCC_CONVERT_SIGNALS", "TRUE");
        let mut dll_paths = vec![];
        for dll in [
            "libgcc_s_seh-1.dll",
            "libstdc++-6.dll",
            "libwinpthread-1.dll",
        ] {
            dll_paths.extend(find_mingw_dll(dll));
        }
        for dll in dll_paths {
            copy_file(dll, &out_dir);
        }
    }

    for entry in std::fs::read_dir(bin)? {
        copy_file(entry?.path(), &out_dir);
    }

    if target_triple::HOST.contains("windows") {
        build.include("..");
        println!("cargo:rustc-link-lib=dylib=user32");
    }

    build
        .flag_if_supported("-std=c++17")
        .define("_USE_MATH_DEFINES", "TRUE")
        .include(include)
        .include("include")
        .compile("wrapper");

    println!("cargo:rustc-link-lib=static=wrapper");

    println!("cargo:rerun-if-changed=src/lib.rs");
    println!("cargo:rerun-if-changed=include/wrapper.hxx");

    Ok(())
}

fn get_occ_dir() -> (PathBuf, PathBuf, PathBuf) {
    #[cfg(feature = "occ-build")]
    let occ = occ_build::build();
    #[cfg(not(feature = "occ-build"))]
    let occ = {
        let current_dir = std::env::current_dir().unwrap();
        current_dir.join("OCCT")
    };

    let bin = occ.join("bin");
    let include = occ.join("include");
    let lib = occ.join("lib");

    #[cfg(debug_assertions)]
    #[cfg(feature = "occ-build")]
    if target_triple::HOST.contains("msvc") {
        let bin = occ.join("bind");
        let lib = occ.join("libd");
        return (bin, include, lib);
    }
    (bin, include, lib)
}
Meta

rustc --version --verbose:

rustc 1.84.1 (e71f9a9a9 2025-01-27)
binary: rustc
commit-hash: e71f9a9a98b0faf423844bf0ba7438f29dc27d58
commit-date: 2025-01-27
host: x86_64-pc-windows-gnu
release: 1.84.1
LLVM version: 19.1.5
Error output
thread 'rustc' panicked at /rust/deps\ar_archive_writer-0.4.2\src\archive_writer.rs:792:30:
called `Result::unwrap()` on an `Err` value: TryFromIntError(())

error: the compiler unexpectedly panicked. this is a bug.

note: we would appreciate a bug report: https://github.com/rust-lang/rust/issues/new?labels=C-bug%2C+I-ICE%2C+T-compiler&template=ice.md

note: rustc 1.84.1 (e71f9a9a9 2025-01-27) running on x86_64-pc-windows-gnu

note: compiler flags: --crate-type lib -C opt-level=3 -C embed-bitcode=no -C strip=debuginfo

note: some of the compiler flags provided by cargo are hidden

query stack during panic:
end of query stack
warning: occ-sys@0.1.0: In file included from D:\code\occ-import\target\release\build\occ-sys-dd7c4f734379bb9d\out\cxxbridge\sources\occ-sys\src\lib.rs.cc:1:
warning: occ-sys@0.1.0: ../occ-sys/include/wrapper.hxx: In function 'const gp_Vec& xyz2vec(const gp_XYZ&)':
warning: occ-sys@0.1.0: ../occ-sys/include/wrapper.hxx:216:58: warning: returning reference to temporary [-Wreturn-local-addr]    
warning: occ-sys@0.1.0:   216 | inline const gp_Vec &xyz2vec(const gp_XYZ &xyz) { return xyz; }
warning: occ-sys@0.1.0:       |                                                          ^~~
error: could not compile `occ-sys` (lib)

Caused by:
  process didn't exit successfully: `D:\Scoop\persist\rustup\.rustup\toolchains\stable-x86_64-pc-windows-gnu\bin\rustc.exe --crate-name occ_sys --edition=2021 occ-sys\src\lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=129 --crate-type lib --emit=dep-info,metadata,link -C opt-level=3 -C embed-bitcode=no --cfg "feature=\"occ-build\"" --check-cfg cfg(docsrs) --check-cfg "cfg(feature, values(\"occ-build\"))" -C metadata=7d22994cf9cff0c3 -C extra-filename=-7d22994cf9cff0c3 --out-dir D:\code\occ-import\target\release\deps -C strip=debuginfo -L dependency=D:\code\occ-import\target\release\deps --extern cxx=D:\code\occ-import\target\release\deps\libcxx-15a77d07e7dd20bf.rmeta -L native=D:\code\occ-import\target\release\build\occ-sys-dd7c4f734379bb9d\out\lib -L native=D:\code\occ-import\target\release\build\occ-sys-dd7c4f734379bb9d\out -l static=TKBin.dll -l static=TKBinL.dll -l static=TKBinTObj.dll -l static=TKBinXCAF.dll -l static=TKBO.dll -l static=TKBool.dll -l static=TKBRep.dll -l static=TKCAF.dll -l static=TKCDF.dll -l static=TKDE.dll -l static=TKDECascade.dll -l static=TKDEGLTF.dll -l static=TKDEIGES.dll -l static=TKDEOBJ.dll -l static=TKDEPLY.dll -l static=TKDESTEP.dll -l static=TKDESTL.dll -l static=TKDEVRML.dll -l static=TKernel.dll -l static=TKFeat.dll -l static=TKFillet.dll -l static=TKG2d.dll -l static=TKG3d.dll -l static=TKGeomAlgo.dll -l static=TKGeomBase.dll -l static=TKHLR.dll -l static=TKLCAF.dll -l static=TKMath.dll -l static=TKMesh.dll -l static=TKOffset.dll -l static=TKPrim.dll -l static=TKRWMesh.dll -l static=TKService.dll -l static=TKShHealing.dll -l static=TKStd.dll -l static=TKStdL.dll -l static=TKTObj.dll -l static=TKTopAlgo.dll -l static=TKV3d.dll -l static=TKVCAF.dll -l static=TKXCAF.dll -l static=TKXMesh.dll -l static=TKXml.dll -l static=TKXmlL.dll -l static=TKXmlTObj.dll -l static=TKXmlXCAF.dll -l static=TKXSBase.dll -l static=wrapper -l static=wrapper -L native=D:\code\occ-import\target\release\build\cxx-ecb1bdbf044545f3\out -L native=D:\code\occ-import\target\release\build\link-cplusplus-7251c9931d89a661\out` (exit code: 101)
Backtrace

   0:     0x7ff9eaaed1b3 - std::backtrace_rs::backtrace::dbghelp64::trace::h7d12d9b19ee258d1
                               at /rustc/e71f9a9a98b0faf423844bf0ba7438f29dc27d58\library/std\src\..\..\backtrace\src\backtrace/dbghelp64.rs:91:5
   1:     0x7ff9eaaed1b3 - std::backtrace_rs::backtrace::trace_unsynchronized::h0f4ebf753afa50a5
                               at /rustc/e71f9a9a98b0faf423844bf0ba7438f29dc27d58\library/std\src\..\..\backtrace\src\backtrace/mod.rs:66:5
   2:     0x7ff9eaaed1b3 - std::sys::backtrace::_print_fmt::hb31052709297c0fa
                               at /rustc/e71f9a9a98b0faf423844bf0ba7438f29dc27d58\library/std\src\sys/backtrace.rs:66:9
   3:     0x7ff9eaaed1b3 - <std::sys::backtrace::BacktraceLock::print::DisplayBacktrace as core::fmt::Display>::fmt::h4cc3f7934b123c8e
                               at /rustc/e71f9a9a98b0faf423844bf0ba7438f29dc27d58\library/std\src\sys/backtrace.rs:39:26
   4:     0x7ff9eab3df9a - core::fmt::rt::Argument::fmt::hac6f3878855abe6c
                               at /rustc/e71f9a9a98b0faf423844bf0ba7438f29dc27d58\library/core\src\fmt/rt.rs:177:76
   5:     0x7ff9eab3df9a - core::fmt::write::ha0bd3b4e85d06134
                               at /rustc/e71f9a9a98b0faf423844bf0ba7438f29dc27d58\library/core\src\fmt/mod.rs:1189:21
   6:     0x7ff9eaae31a2 - std::io::Write::write_fmt::h2f2e206c19722672
                               at /rustc/e71f9a9a98b0faf423844bf0ba7438f29dc27d58\library/std\src\io/mod.rs:1884:15
   7:     0x7ff9eaaed025 - std::sys::backtrace::BacktraceLock::print::he81bbb3c27114a08
                               at /rustc/e71f9a9a98b0faf423844bf0ba7438f29dc27d58\library/std\src\sys/backtrace.rs:42:9
   8:     0x7ff9eaaef8d7 - std::panicking::default_hook::{{closure}}::h640063efa4a247ec
                               at /rustc/e71f9a9a98b0faf423844bf0ba7438f29dc27d58\library/std\src/panicking.rs:268:22
   9:     0x7ff9eaaef712 - std::panicking::default_hook::h30d648e7935cc15e
                               at /rustc/e71f9a9a98b0faf423844bf0ba7438f29dc27d58\library/std\src/panicking.rs:295:9
  10:     0x7ff9b12065de - <alloc[8411ff2cd313d67d]::boxed::Box<rustc_driver_impl[cdd40f30474d6fc7]::install_ice_hook::{closure#0}> as core[767214e8a6678fdb]::ops::function::Fn<(&dyn for<'a, 'b> core[767214e8a6678fdb]::ops::function::Fn<(&'a std[c5a75c30f10ea6e9]::panic::PanicHookInfo<'b>,), Output = ()> + core[767214e8a6678fdb]::marker::Sync + core[767214e8a6678fdb]::marker::Send, &std[c5a75c30f10ea6e9]::panic::PanicHookInfo)>>::call
  11:     0x7ff9eaaf00ca - <alloc::boxed::Box<F,A> as core::ops::function::Fn<Args>>::call::h8e0885c46e6ac64d
                               at /rustc/e71f9a9a98b0faf423844bf0ba7438f29dc27d58\library/alloc\src/boxed.rs:1986:9
  12:     0x7ff9eaaf00ca - std::panicking::rust_panic_with_hook::h7dd330a4ddd4aa09
                               at /rustc/e71f9a9a98b0faf423844bf0ba7438f29dc27d58\library/std\src/panicking.rs:809:13
  13:     0x7ff9eaaeff22 - std::panicking::begin_panic_handler::{{closure}}::h2da770a92761b8ca
                               at /rustc/e71f9a9a98b0faf423844bf0ba7438f29dc27d58\library/std\src/panicking.rs:674:13
  14:     0x7ff9eaaeda1f - std::sys::backtrace::__rust_end_short_backtrace::h4247fc0670896cf6
                               at /rustc/e71f9a9a98b0faf423844bf0ba7438f29dc27d58\library/std\src\sys/backtrace.rs:170:18
  15:     0x7ff9eaaefb9e - rust_begin_unwind
                               at /rustc/e71f9a9a98b0faf423844bf0ba7438f29dc27d58\library/std\src/panicking.rs:665:5
  16:     0x7ff9eab3a2f1 - core::panicking::panic_fmt::hd1329b78e2ae8db5
                               at /rustc/e71f9a9a98b0faf423844bf0ba7438f29dc27d58\library/core\src/panicking.rs:76:14
  17:     0x7ff9eab3a8c0 - core::result::unwrap_failed::hcb3500212c99c5c4
                               at /rustc/e71f9a9a98b0faf423844bf0ba7438f29dc27d58\library/core\src/result.rs:1699:5
  18:     0x7ff9b36ac762 - ar_archive_writer[8c4d3102f93bd341]::archive_writer::write_archive_to_stream::<std[c5a75c30f10ea6e9]::fs::File>
  19:     0x7ff9b36346f0 - <rustc_codegen_ssa[d0f34bae28f8725b]::back::archive::ArArchiveBuilder as rustc_codegen_ssa[d0f34bae28f8725b]::back::archive::ArchiveBuilder>::build
  20:     0x7ff9b355232d - rustc_codegen_ssa[d0f34bae28f8725b]::back::link::link_binary
  21:     0x7ff9b16edab3 - <rustc_codegen_llvm[651f8914520d52c9]::LlvmCodegenBackend as rustc_codegen_ssa[d0f34bae28f8725b]::traits::backend::CodegenBackend>::link
  22:     0x7ff9b14459fb - <rustc_interface[2651a7fbd6b9d49e]::queries::Linker>::link
  23:     0x7ff9b11d6dca - rustc_span[2280da7994b0f928]::create_session_globals_then::<core[767214e8a6678fdb]::result::Result<(), rustc_span[2280da7994b0f928]::ErrorGuaranteed>, rustc_interface[2651a7fbd6b9d49e]::util::run_in_thread_with_globals<rustc_interface[2651a7fbd6b9d49e]::util::run_in_thread_pool_with_globals<rustc_interface[2651a7fbd6b9d49e]::interface::run_compiler<core[767214e8a6678fdb]::result::Result<(), rustc_span[2280da7994b0f928]::ErrorGuaranteed>, rustc_driver_impl[cdd40f30474d6fc7]::run_compiler::{closure#0}>::{closure#1}, core[767214e8a6678fdb]::result::Result<(), rustc_span[2280da7994b0f928]::ErrorGuaranteed>>::{closure#0}, core[767214e8a6678fdb]::result::Result<(), rustc_span[2280da7994b0f928]::ErrorGuaranteed>>::{closure#0}::{closure#0}::{closure#0}>
  24:     0x7ff9b118496b - std[c5a75c30f10ea6e9]::sys::backtrace::__rust_begin_short_backtrace::<rustc_interface[2651a7fbd6b9d49e]::util::run_in_thread_with_globals<rustc_interface[2651a7fbd6b9d49e]::util::run_in_thread_pool_with_globals<rustc_interface[2651a7fbd6b9d49e]::interface::run_compiler<core[767214e8a6678fdb]::result::Result<(), rustc_span[2280da7994b0f928]::ErrorGuaranteed>, rustc_driver_impl[cdd40f30474d6fc7]::run_compiler::{closure#0}>::{closure#1}, core[767214e8a6678fdb]::result::Result<(), rustc_span[2280da7994b0f928]::ErrorGuaranteed>>::{closure#0}, core[767214e8a6678fdb]::result::Result<(), rustc_span[2280da7994b0f928]::ErrorGuaranteed>>::{closure#0}::{closure#0}, core[767214e8a6678fdb]::result::Result<(), rustc_span[2280da7994b0f928]::ErrorGuaranteed>> 
  25:     0x7ff9b121d763 - <<std[c5a75c30f10ea6e9]::thread::Builder>::spawn_unchecked_<rustc_interface[2651a7fbd6b9d49e]::util::run_in_thread_with_globals<rustc_interface[2651a7fbd6b9d49e]::util::run_in_thread_pool_with_globals<rustc_interface[2651a7fbd6b9d49e]::interface::run_compiler<core[767214e8a6678fdb]::result::Result<(), rustc_span[2280da7994b0f928]::ErrorGuaranteed>, rustc_driver_impl[cdd40f30474d6fc7]::run_compiler::{closure#0}>::{closure#1}, core[767214e8a6678fdb]::result::Result<(), rustc_span[2280da7994b0f928]::ErrorGuaranteed>>::{closure#0}, core[767214e8a6678fdb]::result::Result<(), rustc_span[2280da7994b0f928]::ErrorGuaranteed>>::{closure#0}::{closure#0}, core[767214e8a6678fdb]::result::Result<(), rustc_span[2280da7994b0f928]::ErrorGuaranteed>>::{closure#1} as core[767214e8a6678fdb]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0}
  26:     0x7ff9eaaffccd - <alloc::boxed::Box<F,A> as core::ops::function::FnOnce<Args>>::call_once::hbeb84686bcd00b54
                               at /rustc/e71f9a9a98b0faf423844bf0ba7438f29dc27d58\library/alloc\src/boxed.rs:1972:9
  27:     0x7ff9eaaffccd - <alloc::boxed::Box<F,A> as core::ops::function::FnOnce<Args>>::call_once::h2e8e227ead64960c
                               at /rustc/e71f9a9a98b0faf423844bf0ba7438f29dc27d58\library/alloc\src/boxed.rs:1972:9
  28:     0x7ff9eaaffccd - std::sys::pal::windows::thread::Thread::new::thread_start::h5da5085e752f085d
                               at /rustc/e71f9a9a98b0faf423844bf0ba7438f29dc27d58\library/std\src\sys\pal\windows/thread.rs:55:22 
  29:     0x7ffaa38e257d - <unknown>
  30:     0x7ffaa52aaa68 - <unknown>

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Reproduce the supplied build.rs case on x86_64-pc-windows-gnu with rustc 1.84.1, using the cxx-rs bridge and OCCT 7.9.0 setup described. Start at ar_archive_writer-0.4.2/src/archive_writer.rs:792 and trace the archive-building failure. Done means the reproduction no longer triggers an internal compiler panic and the regression is covered by an appropriate compiler test.

Written by the indexing model from the issue text.

Assessment

Tech stack
cpp, rust
Domain
compilers
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
28/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.