Why is Rust unable to connect to Windows?

I downloaded and installed the Rust and Cargo night hours on my machine and used Cargo to create a new binary project:

Cifram@Valyria ~ $ cargo new test --bin 

Then I try to start this virgin project, again with a new, unsullied installation of Rust and Cargo and get the following:

 Cifram@Valyria ~/test $ cargo run --verbose Compiling test v0.0.1 (file:///C:/cygwin64/home/Cifram/test) Running `rustc C:\cygwin64\home\Cifram\test\src\main.rs --crate-name test --crate-type bin -g --out-dir C:\cygwin64\home\Cifram\test\target --dep-info C:\cygwin64\home\Cifram\test\target\.fingerprint\test-51757ad0485ed143\dep-bin-test -LC:\cygwin64\home\Cifram\test\target -LC:\cygwin64\home\Cifram\test\target\deps` error: linking with `gcc` failed: exit code: 1 note: gcc '-m64' '-L' 'C:\Program Files (x86)\Rust\bin\rustlib\x86_64-w64-mingw32\lib' '-o' 'C:\cygwin64\home\Cifram\test\target\test.exe' 'C:\cygwin64\home\Cifram\test\target\test.o' '-Wl,--whole-archive' '-lmorestack' '-Wl,--no-whole-archive' '-fno-lto' '-fno-use-linker-plugin' '-Wl,--gc-sections' '-static-libgcc' '-Wl,--enable-long-section-names' '-Wl,--nxcompat' 'C:\Program Files (x86)\Rust\bin\rustlib\x86_64-w64-mingw32\lib\libnative-4e7c5e5c.rlib' 'C:\Program Files (x86)\Rust\bin\rustlib\x86_64-w64-mingw32\lib\libstd-4e7c5e5c.rlib' 'C:\Program Files (x86)\Rust\bin\rustlib\x86_64-w64-mingw32\lib\libsync-4e7c5e5c.rlib' 'C:\Program Files (x86)\Rust\bin\rustlib\x86_64-w64-mingw32\lib\librustrt-4e7c5e5c.rlib' 'C:\Program Files (x86)\Rust\bin\rustlib\x86_64-w64-mingw32\lib\libcollections-4e7c5e5c.rlib' 'C:\Program Files (x86)\Rust\bin\rustlib\x86_64-w64-mingw32\lib\liballoc-4e7c5e5c.rlib' 'C:\Program Files (x86)\Rust\bin\rustlib\x86_64-w64-mingw32\lib\libunicode-4e7c5e5c.rlib' 'C:\Program Files (x86)\Rust\bin\rustlib\x86_64-w64-mingw32\lib\liblibc-4e7c5e5c.rlib' 'C:\Program Files (x86)\Rust\bin\rustlib\x86_64-w64-mingw32\lib\librand-4e7c5e5c.rlib' 'C:\Program Files (x86)\Rust\bin\rustlib\x86_64-w64-mingw32\lib\libcore-4e7c5e5c.rlib' '-L' 'C:\cygwin64\home\Cifram\test\target' '-L' 'C:\cygwin64\home\Cifram\test\target\deps' '-L' 'C:\cygwin64\home\Cifram\test\.rust' '-L' 'C:\cygwin64\home\Cifram\test' '-Wl,--whole-archive' '-Wl,-Bstatic' '-Wl,--no-whole-archive' '-Wl,-Bdynamic' '-lws2_32' '-lcompiler-rt' note: C:\cygwin64\home\Cifram\test\target\test.o: file not recognized: File format not recognized collect2.exe: error: ld returned 1 exit status error: aborting due to previous error Could not compile `test`. Caused by: Process didn't exit successfully: `rustc C:\cygwin64\home\Cifram\test\src\main.rs --crate-name test --crate-type bin -g --out-dir C:\cygwin64\home\Cifram\test\target --dep-info C:\cygwin64\home\Cifram\test\target\.fingerprint\test-51757ad0485ed143\dep-bin-test -LC:\cygwin64\home\Cifram\test\target -LC:\cygwin64\home\Cifram\test\target\deps` (status=101) 

I'm not sure why rustc calls gcc since I realized that it was built on top of LLVM. I have gcc installed via MinGW, so my first thought was that it was possible that installing gcc was in the way.

 Cifram@Valyria ~ $ gcc -v Using built-in specs. COLLECT_GCC=C:\MinGW\bin\gcc.exe COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/4.8.1/lto-wrapper.exe Target: mingw32 Configured with: ../gcc-4.8.1/configure --prefix=/mingw --host=mingw32 --build=mingw32 --without-pic --enable-shared --enable-static --with-gnu-ld --enable-lto --enable-libssp --disable-multilib --enable-languages=c,c++,fortran,objc,obj-c++,ada --disable-sjlj-exceptions --with-dwarf2 --disable-win32-registry --enable-libstdcxx-debug --enable-version-specific-runtime-libs --with-gmp=/usr/src/pkg/gmp-5.1.2-1-mingw32-src/bld --with-mpc=/usr/src/pkg/mpc-1.0.1-1-mingw32-src/bld --with-mpfr= --with-system-zlib --with-gnu-as --enable-decimal-float=yes --enable-libgomp --enable-threads --with-libiconv-prefix=/mingw32 --with-libintl-prefix=/mingw --disable-bootstrap LDFLAGS=-s CFLAGS=-D_USE_32BIT_TIME_T Thread model: win32 gcc version 4.8.1 (GCC) 

So this is an updated version of gcc. But still, perhaps this is not what rustc expects. So I deleted C: \ MinGW \ bin from my path and tried again and got:

 Cifram@Valyria ~/test $ cargo run --verbose Compiling test v0.0.1 (file:///C:/cygwin64/home/Cifram/test) Running `rustc C:\cygwin64\home\Cifram\test\src\main.rs --crate-name test --crate-type bin -g --out-dir C:\cygwin64\home\Cifram\test\target --dep-info C:\cygwin64\home\Cifram\test\target\.fingerprint\test-51757ad0485ed143\dep-bin-test -LC:\cygwin64\home\Cifram\test\target -LC:\cygwin64\home\Cifram\test\target\deps` error: linking with `gcc` failed: exit code: 1 note: gcc '-m64' '-L' 'C:\Program Files (x86)\Rust\bin\rustlib\x86_64-w64-mingw32\lib' '-o' 'C:\cygwin64\home\Cifram\test\target\test.exe' 'C:\cygwin64\home\Cifram\test\target\test.o' '-Wl,--whole-archive' '-lmorestack' '-Wl,--no-whole-archive' '-fno-lto' '-fno-use-linker-plugin' '-Wl,--gc-sections' '-static-libgcc' '-Wl,--enable-long-section-names' '-Wl,--nxcompat' 'C:\Program Files (x86)\Rust\bin\rustlib\x86_64-w64-mingw32\lib\libnative-4e7c5e5c.rlib' 'C:\Program Files (x86)\Rust\bin\rustlib\x86_64-w64-mingw32\lib\libstd-4e7c5e5c.rlib' 'C:\Program Files (x86)\Rust\bin\rustlib\x86_64-w64-mingw32\lib\librand-4e7c5e5c.rlib' 'C:\Program Files (x86)\Rust\bin\rustlib\x86_64-w64-mingw32\lib\libsync-4e7c5e5c.rlib' 'C:\Program Files (x86)\Rust\bin\rustlib\x86_64-w64-mingw32\lib\librustrt-4e7c5e5c.rlib' 'C:\Program Files (x86)\Rust\bin\rustlib\x86_64-w64-mingw32\lib\libcollections-4e7c5e5c.rlib' 'C:\Program Files (x86)\Rust\bin\rustlib\x86_64-w64-mingw32\lib\liballoc-4e7c5e5c.rlib' 'C:\Program Files (x86)\Rust\bin\rustlib\x86_64-w64-mingw32\lib\liblibc-4e7c5e5c.rlib' 'C:\Program Files (x86)\Rust\bin\rustlib\x86_64-w64-mingw32\lib\libunicode-4e7c5e5c.rlib' 'C:\Program Files (x86)\Rust\bin\rustlib\x86_64-w64-mingw32\lib\libcore-4e7c5e5c.rlib' '-L' 'C:\cygwin64\home\Cifram\test\target' '-L' 'C:\cygwin64\home\Cifram\test\target\deps' '-L' 'C:\cygwin64\home\Cifram\test\.rust' '-L' 'C:\cygwin64\home\Cifram\test' '-Wl,--whole-archive' '-Wl,-Bstatic' '-Wl,--no-whole-archive' '-Wl,-Bdynamic' '-lws2_32' '-lcompiler-rt' note: ld: this linker was not configured to use sysroots error: aborting due to previous error Could not compile `test`. Caused by: Process didn't exit successfully: `rustc C:\cygwin64\home\Cifram\test\src\main.rs --crate-name test --crate-type bin -g --out-dir C:\cygwin64\home\Cifram\test\target --dep-info C:\cygwin64\home\Cifram\test\target\.fingerprint\test-51757ad0485ed143\dep-bin-test -LC:\cygwin64\home\Cifram\test\target -LC:\cygwin64\home\Cifram\test\target\deps` (status=101) 

Well, this is a slightly different mistake, but not really better. The same gcc command does not work, but before the error:

 C:\cygwin64\home\Cifram\test\target\test.o: file not recognized: File format not recognized 

And now this:

 ld: this linker was not configured to use sysroots 

I do not find any of these terribly significant. I tried to run "rustc main.rs" directly. The same errors were received (except for "src \ main.o" instead of "target \ test.o"). Tried to do all this from the windows command line instead of cygwin. The same mistakes. So it doesn’t look like Cargo or cygwin is to blame. I also tried downloading the latest β€œstable” version of Rust (0.12.0) and still got the same errors. I searched for these errors and searched for them. So my ideas are running out.

reference

+5
source share
2 answers

Success! Turns out the problem is that I also installed ld inside cygwin. So, from what I can tell, he used the version of gcc that comes as part of rustc, but gcc called C: \ cygwin64 \ bin \ ld.exe, not its own internal ld.

As soon as I removed ld, everything worked.

Keep in mind, this reinforces the point I made in my comment: apparently, I cannot develop Rust and C / C ++ development on the same machine at the same time. Even to compile C libraries, I want to access Rust, like SDL2 or GLFW. This is terribly uncomfortable. If rustc needs specific versions of gcc and ld and comes with the correct versions, it should not access system versions by default. If you need to override it in gcc or ld versions, this must be done using an explicit command line option.

Edit: Adding an absent no that inadvertently changed the meaning of the sentence.

+1
source

As an alternative solution, I manipulated a path variable when invoking Rust from a cygwin shell shell. As I understand it, Rust will use the system path, look for gcc, and then try to use it. By manipulating by removing the GCC is not required, it will disappear and use the one with which the rust installer came.

PATH = '/ c / Download program files / Rust / bin

* Use the correct cygwin path to the Rust installation location. On my system, this is / c / Program ...

+1
source

Source: https://habr.com/ru/post/1205250/


All Articles