Open uazu opened 3 years ago
Ran into the same issue (windows, clang-cl), in debug mode you either have to compile the c++ part with /MT
or the rust part with /MDd
, otherwise they arent compatible for linking, this should honestly be documented somewhere
@uazu Were you able to get a /Mtd build by setting the CFLAGS ? It might be simple but how to set such CFLAGS in cargo?
@uazu Were you able to get a /Mtd build by setting the CFLAGS ? It might be simple but how to set such CFLAGS in cargo?
Yes, we're still successfully building that way. Since this is a C++ project that calls Rust, we're setting CFLAGS in CMake, since that's the top-level tool that is building both the C++ code and the Rust code. (Don't ask me about CMake though.)
This took us a while to figure out. A Rust "staticlib" debug-build outputs a LIB which references MSVCRT. This is not suitable for linking with C++ code built using MSVC debug settings (/MDd), which requires everything to use only MSVCRTD. To get a Rust LIB which references MSVCRTD appears to require
CFLAGS=-MDd
andCXXFLAGS=-MDd
set in the Windows environment (e.g.set CFLAGS=-MDd
etc at CMD prompt). This works becausecc
crate picks these up when it callscl.exe
. In our use-case this caused all the mentions of MSVCRT in thedumpbin /all
output for the generated LIB to be replaced with MSVCRTD. Then the link of the LIB to debug C++ code succeeds.So the question is where this should be documented. It is no use documenting this in
cc
crate, because that is deep down the crate tree and no-one is going to look there. Perhaps people don't even realize thatcc
crate is being used. Since it's often someone directly usingcxx
crate to interface to C++ who would hit this problem, it would likely be helpful to document it in thecxx.rs
pages.(Thanks for
cxx
crate, by the way -- it helped us a lot!)